diff --git a/generic_tracers/cobalt_reg_diag.F90 b/generic_tracers/cobalt_reg_diag.F90 index a45c4d6..b0cd16e 100644 --- a/generic_tracers/cobalt_reg_diag.F90 +++ b/generic_tracers/cobalt_reg_diag.F90 @@ -1225,11 +1225,11 @@ subroutine cobalt_reg_diagnostics(diag_list,axes,init_time,phyto,zoo,bact,cobalt vardesc_temp = vardesc("jfed","Dissolved Iron Change layer integral",'h','L','s','mol Fe m-2 s-1','f') cobalt%id_jfed = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) -!liao - vardesc_temp = vardesc("jfedc","Dissolved Iron Change concentration",'h','L','s','mol Fe m-2 s-1','f') + + vardesc_temp = vardesc("jfedc","Dissolved Iron Change concentration",'h','L','s','mol Fe kg-1 s-1','f') cobalt%id_jfedc = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) -!liao + vardesc_temp = vardesc("jfe_ads","Iron adsorption layer integral",'h','L','s','mol Fe m-2 s-1','f') cobalt%id_jfe_ads = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) @@ -2615,11 +2615,11 @@ subroutine cobalt_reg_diagnostics(diag_list,axes,init_time,phyto,zoo,bact,cobalt vardesc_temp = vardesc("jalk","Alkalinity source layer integral",'h','L','s','eq m-2 s-1','f') cobalt%id_jalk = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) -!liao - vardesc_temp = vardesc("jalkc","Alkalinity source layer concentration",'h','L','s','eq m-3 s-1','f') + + vardesc_temp = vardesc("jalkc","Alkalinity source layer concentration",'h','L','s','eq kg-1 s-1','f') cobalt%id_jalkc = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) -!liao + vardesc_temp = vardesc("jalk_plus_btm","Alkalinity source plus btm layer integral",'h','L','s','eq m-2 s-1','f') cobalt%id_jalk_plus_btm = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) @@ -2627,23 +2627,23 @@ subroutine cobalt_reg_diagnostics(diag_list,axes,init_time,phyto,zoo,bact,cobalt vardesc_temp = vardesc("jdic","Dissolved Inorganic Carbon source layer integral",'h','L','s','mol m-2 s-1','f') cobalt%id_jdic = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) -!liao - vardesc_temp = vardesc("jdicc","Dissolved Inorganic Carbon source concentration",'h','L','s','mol m-2 s-1','f') + + vardesc_temp = vardesc("jdicc","Dissolved Inorganic Carbon source concentration",'h','L','s','mol kg-1 s-1','f') cobalt%id_jdicc = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) - vardesc_temp = vardesc("jno3c","no3 source concentration",'h','L','s','mol m-2 s-1','f') + vardesc_temp = vardesc("jno3c","no3 source concentration",'h','L','s','mol kg-1 s-1','f') cobalt%id_jno3c = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) - vardesc_temp = vardesc("jpo4c","po4 source concentration",'h','L','s','mol m-2 s-1','f') + vardesc_temp = vardesc("jpo4c","po4 source concentration",'h','L','s','mol kg-1 s-1','f') cobalt%id_jpo4c = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) - vardesc_temp = vardesc("jsio4c","sio4 source concentration",'h','L','s','mol m-2 s-1','f') + vardesc_temp = vardesc("jsio4c","sio4 source concentration",'h','L','s','mol kg-1 s-1','f') cobalt%id_jsio4c = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) -!liao + vardesc_temp = vardesc("jdic_plus_btm","Dissolved Inorganic Carbon source plus btm layer integral",'h','L','s','mol m-2 s-1','f') cobalt%id_jdic_plus_btm = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) @@ -2663,15 +2663,15 @@ subroutine cobalt_reg_diagnostics(diag_list,axes,init_time,phyto,zoo,bact,cobalt vardesc_temp = vardesc("jo2_plus_btm","O2 source plus btm layer integral",'h','L','s','mol m-2 s-1','f') cobalt%id_jo2_plus_btm = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) -!liao - vardesc_temp = vardesc("jo2","O2 source concentration",'h','L','s','mol m-3 s-1','f') + + vardesc_temp = vardesc("jo2","O2 source concentration layer integral",'h','L','s','mol m-2 s-1','f') cobalt%id_jo2 = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) - vardesc_temp = vardesc("jo2c","O2 source concentration",'h','L','s','mol m-3 s-1','f') + vardesc_temp = vardesc("jo2c","O2 source concentration",'h','L','s','mol kg-1 s-1','f') cobalt%id_jo2c = register_diag_field(package_name, vardesc_temp%name, axes(1:3),& init_time, vardesc_temp%longname,vardesc_temp%units, missing_value = missing_value1) -!liao + !============================================================================================================== ! 2016/07/05 jgj register and send temperature as a test diff --git a/generic_tracers/cobalt_send_diag.F90 b/generic_tracers/cobalt_send_diag.F90 index 3834585..b83538e 100644 --- a/generic_tracers/cobalt_send_diag.F90 +++ b/generic_tracers/cobalt_send_diag.F90 @@ -340,11 +340,9 @@ subroutine cobalt_send_diagnostics(model_time,grid_tmask,Temp,rho_dzt,dzt,& used = g_send_data(cobalt%id_jfed, cobalt%jfed*rho_dzt, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) -!liao used = g_send_data(cobalt%id_jfedc, cobalt%jfed, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) -!liao used = g_send_data(cobalt%id_jfe_ads, cobalt%jfe_ads*rho_dzt, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) @@ -1204,11 +1202,11 @@ subroutine cobalt_send_diagnostics(model_time,grid_tmask,Temp,rho_dzt,dzt,& used = g_send_data(cobalt%id_jalk, cobalt%jalk*rho_dzt, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) -!liao + used = g_send_data(cobalt%id_jalkc, cobalt%jalk, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) -!liao + used = g_send_data(cobalt%id_jalk_plus_btm, cobalt%jalk_plus_btm*rho_dzt, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) @@ -1216,7 +1214,7 @@ subroutine cobalt_send_diagnostics(model_time,grid_tmask,Temp,rho_dzt,dzt,& used = g_send_data(cobalt%id_jdic, cobalt%jdic*rho_dzt, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) -!liao + used = g_send_data(cobalt%id_jdicc, cobalt%jdic, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) @@ -1232,7 +1230,6 @@ subroutine cobalt_send_diagnostics(model_time,grid_tmask,Temp,rho_dzt,dzt,& used = g_send_data(cobalt%id_jsio4c, cobalt%jsio4, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) -!liao used = g_send_data(cobalt%id_jdic_plus_btm, cobalt%jdic_plus_btm*rho_dzt, & model_time, rmask = grid_tmask,& @@ -1253,7 +1250,7 @@ subroutine cobalt_send_diagnostics(model_time,grid_tmask,Temp,rho_dzt,dzt,& used = g_send_data(cobalt%id_jo2_plus_btm, cobalt%jo2_plus_btm*rho_dzt, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) -!liao + used = g_send_data(cobalt%id_jo2, cobalt%jo2*rho_dzt, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) @@ -1261,7 +1258,7 @@ subroutine cobalt_send_diagnostics(model_time,grid_tmask,Temp,rho_dzt,dzt,& used = g_send_data(cobalt%id_jo2c, cobalt%jo2, & model_time, rmask = grid_tmask,& is_in=isc, js_in=jsc, ks_in=1,ie_in=iec, je_in=jec, ke_in=nk) -!liao + !============================================================================================================== ! 2016/07/05 jgj send temperature as a test diff --git a/generic_tracers/cobalt_types.F90 b/generic_tracers/cobalt_types.F90 index 37e711f..33ac4cd 100644 --- a/generic_tracers/cobalt_types.F90 +++ b/generic_tracers/cobalt_types.F90 @@ -973,7 +973,7 @@ module cobalt_types id_irr_aclm = -1, & id_irr_aclm_z = -1, & id_jfed = -1, & - id_jfedc = -1, & !liao + id_jfedc = -1, & id_jprod_ndet = -1, & id_jprod_pdet = -1, & id_jprod_sldon = -1, & @@ -1019,13 +1019,13 @@ module cobalt_types id_irr_mix = -1, & id_irr_aclm_inst = -1, & id_jalk = -1, & - id_jalkc = -1, & !liao + id_jalkc = -1, & id_jalk_plus_btm = -1, & id_jdic = -1, & - id_jdicc = -1, & !liao - id_jno3c = -1, & !liao - id_jpo4c = -1, & !liao - id_jsio4c = -1, & !liao + id_jdicc = -1, & + id_jno3c = -1, & + id_jpo4c = -1, & + id_jsio4c = -1, & id_jdic_plus_btm = -1, & id_jnh4 = -1, & id_jndet = -1, & @@ -1228,8 +1228,8 @@ module cobalt_types id_f_po4_int_100 = -1, & id_f_sio4_int_100 = -1, & id_jo2_plus_btm = -1, & - id_jo2 = -1, & !liao - id_jo2c = -1, & !liao + id_jo2 = -1, & + id_jo2c = -1, & id_jalk_100 = -1, & id_jdic_100 = -1, & id_jdin_100 = -1, & diff --git a/generic_tracers/generic_tracer_utils.F90 b/generic_tracers/generic_tracer_utils.F90 index 9c830fe..588c236 100644 --- a/generic_tracers/generic_tracer_utils.F90 +++ b/generic_tracers/generic_tracer_utils.F90 @@ -190,11 +190,8 @@ module g_tracer_utils ! Surface flux, surface flux of gas, deltap and kw real, _ALLOCATABLE, dimension(:,:) :: stf _NULL - real, _ALLOCATABLE, dimension(:,:) :: stf_gas _NULL - real, _ALLOCATABLE, dimension(:,:) :: deltap _NULL - real, _ALLOCATABLE, dimension(:,:) :: kw _NULL ! Bottom flux @@ -228,9 +225,18 @@ module g_tracer_utils ! An 3D field for random vertical movement, esp. for zooplankton, ... real, _ALLOCATABLE, dimension(:,:,:) :: vdiff _NULL + ! The following arrays are for tracer budget diagnostics + ! originally developed by Enhui Lao, Fan Yang, and Mathieu Poupon. + ! An 3D field for implicit vertical diffusion real, _ALLOCATABLE, dimension(:,:,:) :: vdiffuse_impl _NULL + ! An 3D field for implicit vertical diffusion, concentration + real, _ALLOCATABLE, dimension(:,:,:) :: vdiffusec_impl _NULL + + ! An 3D field for diagnosing forcing from the boundary + real, _ALLOCATABLE, dimension(:,:,:) :: boundary_forcing_tend _NULL + ! An auxiliary 3D field for keeping model dependent change tendencies, ... real, pointer, dimension(:,:,:) :: tendency => NULL() @@ -240,7 +246,7 @@ module g_tracer_utils integer :: diag_id_alpha=-1, diag_id_csurf=-1, diag_id_sc_no=-1, diag_id_aux=-1 integer :: diag_id_btf=-1,diag_id_btm=-1, diag_id_vmove=-1, diag_id_vdiff=-1 integer :: diag_id_vdiffuse_impl = -1, diag_id_tendency = -1, diag_id_field_taup1 = -1 - + integer :: diag_id_vdiffusec_impl = -1, diag_id_boundary_forcing_tend = -1 ! Tracer Initial concentration if constant everywhere real :: const_init_value = 0.0 real :: initial_value = 0.0 @@ -1058,9 +1064,14 @@ subroutine g_tracer_init(g_tracer) g_tracer%field_3d => remap_bounds(isd, jsd, 1, g_tracer%field(:,:,:,1)) if(g_tracer%prog) then - allocate(g_tracer%tendency(isd:ied,jsd:jed,nk)); g_tracer%tendency(:,:,:) = 0.0 + allocate(g_tracer%tendency(isd:ied,jsd:jed,nk)); + g_tracer%tendency(:,:,:) = 0.0 allocate(g_tracer%vdiffuse_impl(isd:ied,jsd:jed,nk)) - g_tracer%vdiffuse_impl(:,:,:) = 0.0 + g_tracer%vdiffuse_impl(:,:,:) = 0.0 + allocate(g_tracer%vdiffusec_impl(isd:ied,jsd:jed,nk)) + g_tracer%vdiffusec_impl(:,:,:) = 0.0 + allocate(g_tracer%boundary_forcing_tend(isd:ied,jsd:jed,nk)) + g_tracer%boundary_forcing_tend(:,:,:) = 0.0 endif if(g_tracer%flux_gas) then @@ -1243,16 +1254,35 @@ subroutine g_tracer_register_diag(g_tracer) g_tracer_com%axes(1:3), & g_tracer_com%init_time, & 'Implicit vertical diffusion of ' // trim(g_tracer%alias), & - trim('mole/m^2/s'), & + trim('mol kg-1 m s-1'), & missing_value = -1.0e+20) + string=trim(g_tracer%alias) // trim("_vdiffusec_impl") + g_tracer%diag_id_vdiffusec_impl = g_register_diag_field(g_tracer%package_name, & + trim(string), & + g_tracer_com%axes(1:3), & + g_tracer_com%init_time, & + 'Implicit vertical diffusion concentration of ' //trim(g_tracer%alias), & + trim('mol kg-1 s-1'), & + missing_value = -1.0e+20) + + string=trim(g_tracer%alias) // trim("_boundary_forcing_tend") + g_tracer%diag_id_boundary_forcing_tend = g_register_diag_field(g_tracer%package_name, & + trim(string), & + g_tracer_com%axes(1:3), & + g_tracer_com%init_time, & + 'Boundary forcing tendency concentration of ' // trim(g_tracer%alias), & + trim('mol kg-1 s-1'), & + missing_value = -1.0e+20) + + string=trim(g_tracer%alias) // trim("_tendency") g_tracer%diag_id_tendency = g_register_diag_field(g_tracer%package_name, & trim(string), & g_tracer_com%axes(1:3), & g_tracer_com%init_time, & 'Generic tracer tendency of ' // trim(g_tracer%alias), & - trim('mole/m^2/s'), & + trim('mol m-2 s-1'), & missing_value = -1.0e+20) string=trim(g_tracer%alias) // trim("_vdiff") @@ -1270,7 +1300,7 @@ subroutine g_tracer_register_diag(g_tracer) g_tracer_com%axes(1:2), & g_tracer_com%init_time, & 'Total flux of ' // trim(g_tracer%alias) // ' into Ocean Surface', & - trim('mole/m^2/sec'), & + trim('mol m-2 s-1'), & missing_value = -1.0e+20) string=trim(g_tracer%alias) // trim("_stf_gas") @@ -1279,7 +1309,7 @@ subroutine g_tracer_register_diag(g_tracer) g_tracer_com%axes(1:2), & g_tracer_com%init_time, & 'Gas exchange flux of ' // trim(g_tracer%alias) // ' into Ocean Surface', & - trim('mole/m^2/sec'), & + trim('mol m-2 s-1'), & missing_value = -1.0e+20) string=trim(g_tracer%alias) // trim("_stf_gas_aux") @@ -1288,7 +1318,7 @@ subroutine g_tracer_register_diag(g_tracer) g_tracer_com%axes(1:2), & g_tracer_com%init_time, & 'Auxilliary Gas exchange flux of ' // trim(g_tracer%alias) // ' into Ocean Surface', & - trim('mole/m^2/sec'), & + trim('mol m-2 s-1'), & missing_value = -1.0e+20) string=trim(g_tracer%alias) // trim("_deltap") @@ -1315,7 +1345,7 @@ subroutine g_tracer_register_diag(g_tracer) g_tracer_com%axes(1:2), & g_tracer_com%init_time, & 'Total flux of ' // trim(g_tracer%alias) // trim(' into Ocean Bottom'), & - trim('mole/m^2/sec'), & + trim('mol m-2 s-1'), & missing_value = -1.0e+20) string=trim(g_tracer%alias) // trim("_btm_reservoir") @@ -1854,6 +1884,11 @@ subroutine g_tracer_get_3D(g_tracer_list,name,member,array_ptr) array_ptr => g_tracer%vdiff case ('vdiffuse_impl') array_ptr => g_tracer%vdiffuse_impl + case ('vdiffusec_impl') + array_ptr => g_tracer%vdiffusec_impl + case ('boundary_forcing_tend') + array_ptr => g_tracer%boundary_forcing_tend + case default call mpp_error(FATAL, trim(sub_name)//": Not a known member variable: "//trim(member)) end select @@ -1989,6 +2024,10 @@ subroutine g_tracer_get_3D_val(g_tracer_list,name,member,array,isd,jsd,ntau,posi array(:,:,:) = g_tracer%vdiff(:,:,:) case ('vdiffuse_impl') array(:,:,:) = g_tracer%vdiffuse_impl(:,:,:) + case ('vdiffusec_impl') + array(:,:,:) = g_tracer%vdiffusec_impl(:,:,:) + case ('boundary_forcing_tend') + array(:,:,:) = g_tracer%boundary_forcing_tend(:,:,:) case default call mpp_error(FATAL, trim(sub_name)//": Not a known member variable: "//trim(member)) end select @@ -2235,6 +2274,10 @@ subroutine g_tracer_set_3D(g_tracer_list,name,member,array,isd,jsd,ntau) g_tracer%vdiff = array case ('vdiffuse_impl') g_tracer%vdiffuse_impl = array + case ('vdiffusec_impl') + g_tracer%vdiffusec_impl = array + case ('boundary_forcing_tend') + g_tracer%boundary_forcing_tend = array case default call mpp_error(FATAL, trim(sub_name)//": Not a known member variable: "//trim(member)) end select @@ -2861,7 +2904,28 @@ subroutine g_tracer_send_diag(g_tracer_list,model_time,tau) is_in=g_tracer_com%isc, js_in=g_tracer_com%jsc, ks_in=1,& ie_in=g_tracer_com%iec, je_in=g_tracer_com%jec, ke_in=g_tracer_com%nk) endif + + if (g_tracer%diag_id_vdiffuse_impl .gt. 0 .and._ALLOCATED(g_tracer%vdiffuse_impl)) then + used = g_send_data(g_tracer%diag_id_vdiffuse_impl,g_tracer%vdiffuse_impl(:,:,:), model_time,& + rmask = g_tracer_com%grid_tmask(:,:,:),& + is_in=g_tracer_com%isc, js_in=g_tracer_com%jsc, ks_in=1,& + ie_in=g_tracer_com%iec, je_in=g_tracer_com%jec,ke_in=g_tracer_com%nk) + endif + if (g_tracer%diag_id_vdiffusec_impl .gt. 0 .and._ALLOCATED(g_tracer%vdiffusec_impl)) then + used = g_send_data(g_tracer%diag_id_vdiffusec_impl,g_tracer%vdiffusec_impl(:,:,:), model_time,& + rmask = g_tracer_com%grid_tmask(:,:,:),& + is_in=g_tracer_com%isc, js_in=g_tracer_com%jsc, ks_in=1,& + ie_in=g_tracer_com%iec, je_in=g_tracer_com%jec,ke_in=g_tracer_com%nk) + endif + + if (g_tracer%diag_id_boundary_forcing_tend .gt. 0 .and._ALLOCATED(g_tracer%boundary_forcing_tend)) then + used = g_send_data(g_tracer%diag_id_boundary_forcing_tend,g_tracer%boundary_forcing_tend(:,:,:), model_time,& + rmask = g_tracer_com%grid_tmask(:,:,:),& + is_in=g_tracer_com%isc, js_in=g_tracer_com%jsc, ks_in=1,& + ie_in=g_tracer_com%iec, je_in=g_tracer_com%jec,ke_in=g_tracer_com%nk) + endif + if (g_tracer%diag_id_aux .gt. 0) then used = g_send_data(g_tracer%diag_id_aux, g_tracer%tendency(:,:,:), model_time,& rmask = g_tracer_com%grid_tmask(:,:,:),& @@ -3015,7 +3079,7 @@ subroutine g_tracer_diag(g_tracer_list, ilb, jlb, rho_dzt_tau, rho_dzt_taup1, mo is_in=g_tracer_com%isc, js_in=g_tracer_com%jsc, ks_in=1,& ie_in=g_tracer_com%iec, je_in=g_tracer_com%jec, ke_in=g_tracer_com%nk) endif - + !traverse the linked list till hit NULL if(.NOT. associated(g_tracer%next)) exit g_tracer => g_tracer%next @@ -3267,22 +3331,11 @@ subroutine g_tracer_vertdiff_G(g_tracer, h_old, ea, eb, dt, kg_m2_to_H, m_to_H, real :: b_denom_1 ! The first term in the denominator of b1, in H. real :: H_to_kg_m2 ! 1 / kg_m2_to_H. integer :: i, j, k, nz - logical :: do_diagnostic ! ! Save the current state for calculation of the implicit vertical diffusion term ! - - if (g_tracer%diag_id_vdiffuse_impl .gt. 0) then - if (present(mom)) then - do_diagnostic = .not. mom - else - do_diagnostic = .false. - endif - else - do_diagnostic = .false. - endif - if (do_diagnostic) then + if (g_tracer%diag_id_vdiffuse_impl .gt. 0 .or. g_tracer%diag_id_vdiffusec_impl .gt. 0) then do j = g_tracer_com%jsc, g_tracer_com%jec do i = g_tracer_com%isc, g_tracer_com%iec do k = 1, g_tracer_com%nk @@ -3291,7 +3344,7 @@ subroutine g_tracer_vertdiff_G(g_tracer, h_old, ea, eb, dt, kg_m2_to_H, m_to_H, enddo enddo endif - + d1 = 0.0 H_to_kg_m2 = 1.0 / kg_m2_to_H @@ -3386,22 +3439,24 @@ subroutine g_tracer_vertdiff_G(g_tracer, h_old, ea, eb, dt, kg_m2_to_H, m_to_H, enddo; enddo ! i,j - ! - ! Calculate the implicit vertical diffusion term - ! (Note: not sure if this needs any unit conversion) - ! + ! + ! Calculate the implicit vertical diffusion term + ! (Note: not sure if this needs any unit conversion) + ! - if (do_diagnostic) then + if (g_tracer%diag_id_vdiffuse_impl .gt. 0 .or. g_tracer%diag_id_vdiffusec_impl .gt. 0) then do j = g_tracer_com%jsc, g_tracer_com%jec do i = g_tracer_com%isc, g_tracer_com%iec do k = 1, g_tracer_com%nk - g_tracer%vdiffuse_impl(i,j,k) = g_tracer_com%grid_tmask(i,j,k) * & - (g_tracer%field(i,j,k,tau) - g_tracer%vdiffuse_impl(i,j,k)) / dt + !liao: let h_old into vdiffuse and this term is content tendency + g_tracer%vdiffusec_impl(i,j,k) = g_tracer_com%grid_tmask(i,j,k) * & + (g_tracer%field(i,j,k,tau) - g_tracer%vdiffuse_impl(i,j,k))/ dt + g_tracer%vdiffuse_impl(i,j,k) = h_old(i,j,k)*g_tracer_com%grid_tmask(i,j,k) * & + (g_tracer%field(i,j,k,tau) - g_tracer%vdiffuse_impl(i,j,k))/ dt enddo enddo enddo - endif - + endif end subroutine g_tracer_vertdiff_G subroutine g_diag_field_add(node_ptr, diag_id, package_name, name, axes, init_time, longname, units, &