diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index f8d60e67b..40b923d1a 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -1667,6 +1667,8 @@ module GFS_typedefs real(kind=kind_phys) :: rhcmax ! maximum critical relative humidity, replaces rhc_max in physcons.F90 real(kind=kind_phys) :: huge !< huge fill value +!--- AQM Canopy + logical :: do_canopy !< control flag for aqm canopy effects !--- lightning threat and diagsnostics logical :: lightning_threat !< report lightning threat indices @@ -2212,6 +2214,18 @@ module GFS_typedefs ! Diagnostics for coupled air quality model real (kind=kind_phys), pointer :: aod (:) => null() !< instantaneous aerosol optical depth ( n/a ) +!IVAI + ! Diagnostics for coupled air quality model + real (kind=kind_phys), pointer :: coszens(:) => null() ! Cosine SZA for photolysis + real (kind=kind_phys), pointer :: jo3o1d(:) => null() ! instantaneous O3O1D photolysis rate + real (kind=kind_phys), pointer :: jno2 (:) => null() ! instantaneous NO2 photolysis rate + real (kind=kind_phys), pointer :: claie(:) => null() ! Leaf Area Index ECCC + real (kind=kind_phys), pointer :: cfch (:) => null() ! Forest Canopy Height + real (kind=kind_phys), pointer :: cfrt (:) => null() ! Forest Fraction + real (kind=kind_phys), pointer :: cclu (:) => null() ! Clumping Index + real (kind=kind_phys), pointer :: cpopu(:) => null() ! Population density +!IVAI + ! Auxiliary output arrays for debugging real (kind=kind_phys), pointer :: aux2d(:,:) => null() !< auxiliary 2d arrays in output (for debugging) real (kind=kind_phys), pointer :: aux3d(:,:,:)=> null() !< auxiliary 2d arrays in output (for debugging) @@ -4096,6 +4110,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & ! logical :: land_iau_do_stcsmc_adjustment = .false. ! real(kind=kind_phys) :: land_iau_min_T_increment = 0.0001 +!--- switch for aqm canopy effects + logical :: do_canopy = .false. !< flag for canopy option + !--- END NAMELIST VARIABLES NAMELIST /gfs_physics_nml/ & @@ -4255,6 +4272,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- (DFI) time ranges with radar-prescribed microphysics tendencies ! and (maybe) convection suppression fh_dfi_radar, radar_tten_limits, do_cap_suppress, & + ! aqm canopy option + do_canopy, & !--- GSL lightning threat indices lightning_threat !, & ! !--- land_iau_nml @@ -5229,6 +5248,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%do_spp = do_spp Model%n_var_spp = n_var_spp +!--- aqm canopy effects in physics + Model%do_canopy = do_canopy + if (Model%lndp_type/=0) then allocate (Model%lndp_var_list(Model%n_var_lndp)) allocate (Model%lndp_prt_list(Model%n_var_lndp)) @@ -7183,6 +7205,7 @@ subroutine control_print(Model) print *, ' first_time_step : ', Model%first_time_step print *, ' restart : ', Model%restart print *, ' lsm_cold_start : ', Model%lsm_cold_start + print *, ' do_canopy : ', Model%do_canopy print *, ' ' print *, 'lightning threat indexes' print *, ' lightning_threat : ', Model%lightning_threat @@ -8107,6 +8130,42 @@ subroutine diag_create (Diag, Model) Diag%aod = zero end if +!IVAI: + ! Air quality diagnostics + ! -- initialize diagnostic variables + if (Model%cplaqm) then + +!IVAI: photdiag arrays + allocate (Diag%coszens(IM)) + Diag%coszens= zero + + allocate (Diag%jo3o1d(IM)) + Diag%jo3o1d = zero + + allocate (Diag%jno2(IM)) + Diag%jno2 = zero + +!IVAI: canopy arrays read via aqm_emis_read + if (Model%do_canopy) then + allocate (Diag%claie(IM)) + Diag%claie = zero + + allocate (Diag%cfch (IM)) + Diag%cfch = zero + + allocate (Diag%cfrt (IM)) + Diag%cfrt = zero + + allocate (Diag%cclu (IM)) + Diag%cclu = zero + + allocate (Diag%cpopu (IM)) + Diag%cpopu = zero + end if! (Model%do_canopy) + + end if ! (Model%cplaqm) +!IVAI + ! Auxiliary arrays in output for debugging if (Model%naux2d>0) then allocate (Diag%aux2d(IM,Model%naux2d)) diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index b05d879d7..0a8d665a3 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -7765,6 +7765,12 @@ units = flag dimensions = () type = logical +[do_canopy] + standard_name = flag_for_canopy_option + long_name = flag for in-canopy eddy diffusivity adjustment option + units = flag + dimensions = () + type = logical [clm_lake_depth_default] standard_name = default_lake_depth_in_clm_lake_model long_name = default lake depth in clm lake model @@ -7796,7 +7802,6 @@ units = count dimensions = () type = integer - ######################################################################## [ccpp-table-properties] name = GFS_grid_type @@ -8735,6 +8740,46 @@ dimensions = (horizontal_dimension,number_of_diagnostics_variables_for_radiation) type = real kind = kind_phys +[claie] + standard_name = canopy_leaf_area_index + long_name = canopy leaf area index + units = none + dimensions = (horizontal_dimension) + type = real + kind = kind_phys + active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) +[cfch] + standard_name = canopy_forest_height + long_name = canopy forest height + units = m + dimensions = (horizontal_dimension) + type = real + kind = kind_phys + active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) +[cfrt] + standard_name = canopy_forest_fraction + long_name = canopy forest fraction + units = none + dimensions = (horizontal_dimension) + type = real + kind = kind_phys + active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) +[cclu] + standard_name = canopy_clumping_index + long_name = canopy clumping index + units = none + dimensions = (horizontal_dimension) + type = real + kind = kind_phys + active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) +[cpopu] + standard_name = canopy_population_density + long_name = population density used for canopy correction + units = km-2 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys + active = (flag_for_air_quality_coupling .and. flag_for_canopy_option) [topfsw] standard_name = sw_fluxes_top_atmosphere long_name = sw radiation fluxes at toa diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index 86e61bbc7..e09d9f776 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -777,6 +777,97 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop endif endif +!IVAI +!--- air quality diagnostics --- + if (Model%cplaqm) then + +! IVAI: photdiag fields + if (associated(IntDiag%coszens)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'COSZENS' + ExtDiag(idx)%desc = 'Cosine Solar Zenith Angle for Photolysis' + ExtDiag(idx)%unit = 'numerical' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%data%var2 => IntDiag%coszens(:) + endif + + if (associated(IntDiag%jo3o1d)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'JO3O1D' + ExtDiag(idx)%desc = 'photolysis rate O3 for canopy correction' + ExtDiag(idx)%unit = 'min-1' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%data%var2 => IntDiag%jo3o1d(:) + endif + + if (associated(IntDiag%jno2)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'JNO2' + ExtDiag(idx)%desc = 'photolysis rate NO2 for canopy correction' + ExtDiag(idx)%unit = 'min-1' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%data%var2 => IntDiag%jno2(:) + endif + +!IVAI: canopy arrays read via aqm_emis_read + if (Model%do_canopy) then + if (associated(IntDiag%claie)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'CLAIE' + ExtDiag(idx)%desc = 'Leaf Area Index ECCC' + ExtDiag(idx)%unit = 'numerical' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%data%var2 => IntDiag%claie(:) + endif + + if (associated(IntDiag%cfch)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'CFCH' + ExtDiag(idx)%desc = 'Forest Canopy Height' + ExtDiag(idx)%unit = 'm' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%data%var2 => IntDiag%cfch(:) + endif + + if (associated(IntDiag%cfrt)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'CFRT' + ExtDiag(idx)%desc = 'Forest Canopy Fraction' + ExtDiag(idx)%unit = 'numerical' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%data%var2 => IntDiag%cfrt(:) + endif + + if (associated(IntDiag%cclu)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'CCLU' + ExtDiag(idx)%desc = 'Canopy Clumping Index' + ExtDiag(idx)%unit = 'numerical' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%data%var2 => IntDiag%cclu(:) + endif + + if (associated(IntDiag%cpopu)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'CPOPU' + ExtDiag(idx)%desc = 'Population Density for canopy correction' + ExtDiag(idx)%unit = 'km-2' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%data%var2 => IntDiag%cpopu(:) + endif + endif ! (Model%do_canopy) + + end if ! (Model%cplaqm) +!IVAI + ! ! !--- accumulated diagnostics --- @@ -3740,7 +3831,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop endif endif extended_smoke_dust_diagnostics - + idx = idx + 1 ExtDiag(idx)%axes = 3 ExtDiag(idx)%name = 'ebu_smoke' diff --git a/ccpp/physics b/ccpp/physics index 54672d250..5d6bacf1b 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 54672d25027e1c6814ddce8cda5853d824ec1de5 +Subproject commit 5d6bacf1b51e99f7f093fb59a2d5044ce170b379 diff --git a/cpl/module_cplfields.F90 b/cpl/module_cplfields.F90 index b23b3b898..d10eeddaa 100644 --- a/cpl/module_cplfields.F90 +++ b/cpl/module_cplfields.F90 @@ -160,7 +160,7 @@ module module_cplfields FieldInfo("cpl_scalars ", "s")] ! Import Fields ---------------------------------------- - integer, public, parameter :: NimportFields = 67 + integer, public, parameter :: NimportFields = 67 + 3 + 5 !IVAI: add 3 inst_tracer_diag logical, public :: importFieldsValid(NimportFields) type(ESMF_Field), target, public :: importFields(NimportFields) @@ -183,6 +183,17 @@ module module_cplfields FieldInfo("inst_ice_vis_dir_albedo ", "s"), & FieldInfo("wave_z0_roughness_length ", "s"), & FieldInfo("inst_tracer_diag_aod ", "s"), & +!IVAI: import canopy fields from AQM component + FieldInfo("inst_tracer_diag_claie ", "s"), & + FieldInfo("inst_tracer_diag_cfch ", "s"), & + FieldInfo("inst_tracer_diag_cfrt ", "s"), & + FieldInfo("inst_tracer_diag_cclu ", "s"), & + FieldInfo("inst_tracer_diag_cpopu ", "s"), & +!IVAI: import photolysis diagnostics from AQM component + FieldInfo("inst_tracer_diag_coszens ", "s"), & + FieldInfo("inst_tracer_diag_jo3o1d ", "s"), & + FieldInfo("inst_tracer_diag_jno2 ", "s"), & +!IVAI FieldInfo("ocn_current_zonal ", "s"), & FieldInfo("ocn_current_merid ", "s"), & diff --git a/fv3/atmos_model.F90 b/fv3/atmos_model.F90 index d5e10ef20..ecd3d750d 100644 --- a/fv3/atmos_model.F90 +++ b/fv3/atmos_model.F90 @@ -1356,8 +1356,12 @@ subroutine update_atmos_chemistry(state, rc) real(ESMF_KIND_R8), dimension(:,:,:,:), pointer :: q +!IVAI: add coszens, jo3o1d, jno2, claie, cfch, cfrt, cclu, cpopu real(ESMF_KIND_R8), dimension(:,:), pointer :: aod, area, canopy, cmm, & - dqsfc, dtsfc, fice, flake, focn, fsnow, hpbl, nswsfc, oro, psfc, & + claie, cfch, cfrt, cclu, cpopu, & !IVAI + dqsfc, dtsfc, fice, flake, focn, fsnow, hpbl, & + coszens, jo3o1d, jno2, & !IVAI + nswsfc, oro, psfc, & q2m, rain, rainc, rca, shfsfc, slmsk, stype, swet, t2m, tsfc, & u10m, uustar, v10m, vfrac, xlai, zorl, vtype @@ -1384,6 +1388,44 @@ subroutine update_atmos_chemistry(state, rc) call cplFieldGet(state,'inst_tracer_diag_aod', farrayPtr2d=aod, rc=localrc) if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__, rcToReturn=rc)) return + +!IVAI: case ('import') canopy arrays read in via 'aqm_emis_read' + + if (GFS_control%do_canopy) then + call cplFieldGet(state,'inst_tracer_diag_claie', farrayPtr2d=claie, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__, rcToReturn=rc)) return + + call cplFieldGet(state,'inst_tracer_diag_cfch', farrayPtr2d=cfch, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__, rcToReturn=rc)) return + + call cplFieldGet(state,'inst_tracer_diag_cfrt', farrayPtr2d=cfrt, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__, rcToReturn=rc)) return + + call cplFieldGet(state,'inst_tracer_diag_cclu', farrayPtr2d=cclu, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__, rcToReturn=rc)) return + + call cplFieldGet(state,'inst_tracer_diag_cpopu', farrayPtr2d=cpopu, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__, rcToReturn=rc)) return + end if + +!IVAI: case ('import') photdiag arrays + call cplFieldGet(state,'inst_tracer_diag_coszens', farrayPtr2d=coszens, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__, rcToReturn=rc)) return + + call cplFieldGet(state,'inst_tracer_diag_jo3o1d', farrayPtr2d=jo3o1d, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__, rcToReturn=rc)) return + + call cplFieldGet(state,'inst_tracer_diag_jno2', farrayPtr2d=jno2, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__, rcToReturn=rc)) return +!IVAI end if !--- do not import tracer concentrations by default @@ -1458,6 +1500,123 @@ subroutine update_atmos_chemistry(state, rc) GFS_IntDiag%aod(im) = aod(i,j) enddo enddo + + if (GFS_control%do_canopy) then +!IVAI: case ('import') canopy arrays read in via aqm_emis_read +!$OMP parallel do default (none) & +!$OMP shared (nj, ni, Atm_block, GFS_Control, GFS_Intdiag, claie) & +!$OMP private (j, jb, i, ib, nb, ix, im) + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + im = GFS_Control%chunk_begin(nb)+ix-1 + GFS_IntDiag%claie(im) = claie(i,j) + enddo + enddo + +!$OMP parallel do default (none) & +!$OMP shared (nj, ni, Atm_block, GFS_Control, GFS_Intdiag, cfch) & +!$OMP private (j, jb, i, ib, nb, ix, im) + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + im = GFS_Control%chunk_begin(nb)+ix-1 + GFS_IntDiag%cfch(im) = cfch(i,j) + enddo + enddo + +!$OMP parallel do default (none) & +!$OMP shared (nj, ni, Atm_block, GFS_Control, GFS_Intdiag, cfrt) & +!$OMP private (j, jb, i, ib, nb, ix, im) + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + im = GFS_Control%chunk_begin(nb)+ix-1 + GFS_IntDiag%cfrt(im) = cfrt(i,j) + enddo + enddo + +!$OMP parallel do default (none) & +!$OMP shared (nj, ni, Atm_block, GFS_Control, GFS_Intdiag, cclu) & +!$OMP private (j, jb, i, ib, nb, ix, im) + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + im = GFS_Control%chunk_begin(nb)+ix-1 + GFS_IntDiag%cclu(im) = cclu(i,j) + enddo + enddo + +!$OMP parallel do default (none) & +!$OMP shared (nj, ni, Atm_block, GFS_Control, GFS_Intdiag, cpopu) & +!$OMP private (j, jb, i, ib, nb, ix, im) + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + im = GFS_Control%chunk_begin(nb)+ix-1 + GFS_IntDiag%cpopu(im) = cpopu(i,j) + enddo + enddo + endif ! GFS_control%do_canopy + +!IVAI: case ('import') photdiag arrays +!$OMP parallel do default (none) & +!$OMP shared (nj, ni, Atm_block, GFS_Control, GFS_Intdiag, coszens) & +!$OMP private (j, jb, i, ib, nb, ix, im) + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + im = GFS_Control%chunk_begin(nb)+ix-1 + GFS_IntDiag%coszens(im) = coszens(i,j) + enddo + enddo + +!$OMP parallel do default (none) & +!$OMP shared (nj, ni, Atm_block, GFS_Control, GFS_Intdiag, jo3o1d) & +!$OMP private (j, jb, i, ib, nb, ix, im) + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + im = GFS_Control%chunk_begin(nb)+ix-1 + GFS_IntDiag%jo3o1d(im) = jo3o1d(i,j) + enddo + enddo + +!$OMP parallel do default (none) & +!$OMP shared (nj, ni, Atm_block, GFS_Control, GFS_Intdiag, jno2) & +!$OMP private (j, jb, i, ib, nb, ix, im) + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + im = GFS_Control%chunk_begin(nb)+ix-1 + GFS_IntDiag%jno2(im) = jno2(i,j) + enddo + enddo +!IVAI end if if (GFS_control%debug) then @@ -1466,6 +1625,33 @@ subroutine update_atmos_chemistry(state, rc) if (GFS_control%cplaqm) & write(6,'("update_atmos: ",a,": aod - min/max ",3g16.6)') & trim(state), minval(aod), maxval(aod) +!IVAI: case ('import') canopy arrays read via aqm_emis_read + if (GFS_control%cplaqm .and. GFS_control%do_canopy) & + write(6,'("update_atmos: ",a,": claie - min/max ",3g16.6)') & + trim(state), minval(claie), maxval(claie) + if (GFS_control%cplaqm .and. GFS_control%do_canopy) & + write(6,'("update_atmos: ",a,": cfch - min/max ",3g16.6)') & + trim(state), minval(cfch), maxval(cfch) + if (GFS_control%cplaqm .and. GFS_control%do_canopy) & + write(6,'("update_atmos: ",a,": cfrt - min/max ",3g16.6)') & + trim(state), minval(cfrt), maxval(cfrt) + if (GFS_control%cplaqm .and. GFS_control%do_canopy) & + write(6,'("update_atmos: ",a,": cclu - min/max ",3g16.6)') & + trim(state), minval(cclu), maxval(cclu) + if (GFS_control%cplaqm .and. GFS_control%do_canopy) & + write(6,'("update_atmos: ",a,": cpopu - min/max ",3g16.6)') & + trim(state), minval(cpopu), maxval(cpopu) +!IVAI: case ('import') photdiag arrays + if (GFS_control%cplaqm) & + write(6,'("update_atmos: ",a,": coszens - min/max ",3g16.6)') & + trim(state), minval(coszens), maxval(coszens) + if (GFS_control%cplaqm) & + write(6,'("update_atmos: ",a,": jo3o1d - min/max ",3g16.6)') & + trim(state), minval(jo3o1d), maxval(jo3o1d) + if (GFS_control%cplaqm) & + write(6,'("update_atmos: ",a,": jno2 - min/max ",3g16.6)') & + trim(state), minval(jno2), maxval(jno2) +!IVAI end if case ('export')