Changeset 10141 for branches/UKMO/dev_r5518_GO6_package_asm_3d_bgc_v3/NEMOGCM/NEMO/OPA_SRC/ASM/asmbgc.F90
- Timestamp:
- 2018-09-19T17:14:46+02:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_GO6_package_asm_3d_bgc_v3/NEMOGCM/NEMO/OPA_SRC/ASM/asmbgc.F90
r10077 r10141 10 10 !! 'key_hadocc' : HadOCC model 11 11 !! 'key_medusa' : MEDUSA model 12 !! 'key_foam_medusa' : MEDUSA extras for FOAM OBS and ASM13 12 !! 'key_roam' : MEDUSA extras for carbonate cycle 14 13 !! 'key_karaml' : Kara mixed layer depth … … 56 55 & jptra 57 56 #endif 58 #if defined key_medusa && defined key_foam_medusa57 #if defined key_medusa 59 58 USE asmphyto2dbal_medusa, ONLY: & ! phyto2d balancing for MEDUSA 60 59 & asm_phyto2d_bal_medusa … … 161 160 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: pph_bkginc ! pph inc 162 161 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: po2_bkginc ! po2 inc 163 #if defined key_top164 162 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: phyto2d_balinc ! Balancing incs from ocean colour 165 163 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: phyto3d_balinc ! Balancing incs from p(l)chltot 166 164 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: pco2_balinc ! Balancing incs from spco2/sfco2 167 165 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: ph_balinc ! Balancing incs from pph 168 #endif 169 170 #if defined key_hadocc || (defined key_medusa && defined key_foam_medusa) 166 171 167 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: pgrow_avg_bkg ! Background phyto growth 172 168 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ploss_avg_bkg ! Background phyto loss … … 174 170 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: mld_max_bkg ! Background max MLD 175 171 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: tracer_bkg ! Background tracer state 176 #endif177 #if defined key_hadocc178 172 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: chl_bkg ! Background chl 179 173 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: cchl_p_bkg ! Background c:chl 180 #endif181 174 182 175 # include "domzgr_substitute.h90" … … 197 190 !!------------------------------------------------------------------------ 198 191 199 #if ! defined key_top || ( ! defined key_hadocc && ( ! defined key_medusa || ! defined key_foam_medusa ))192 #if ! defined key_top || ( ! defined key_hadocc && ! defined key_medusa ) 200 193 CALL ctl_stop( ' Attempting to assimilate biogeochemical observations', & 201 194 & ' but no compatible biogeochemical model is available' ) … … 206 199 & ln_slphynoninc .OR. ln_psi4inc .OR. ln_pphinc .OR. ln_po2inc ) THEN 207 200 CALL ctl_stop( ' Cannot assimilate PFTs, Si4, pH or O2 into HadOCC' ) 201 ENDIF 202 #endif 203 204 #if defined key_medusa 205 IF ( .NOT. ln_foam_medusa ) THEN 206 CALL ctl_stop( ' MEDUSA data assimilation options not turned on: set ln_foam_medusa' ) 208 207 ENDIF 209 208 #endif … … 517 516 !!------------------------------------------------------------------------ 518 517 519 #if defined key_top && ( defined key_hadocc || (defined key_medusa && defined key_foam_medusa))518 #if defined key_top && ( defined key_hadocc || defined key_medusa ) 520 519 IF ( ln_slchltotinc .OR. ln_slchldiainc .OR. ln_slchlnoninc .OR. & 521 520 & ln_schltotinc .OR. ln_slphytotinc .OR. ln_slphydiainc .OR. & … … 552 551 chl_bkg(:,:,:) = chl_bkg(:,:,:) * tmask(:,:,:) 553 552 cchl_p_bkg(:,:,:) = cchl_p_bkg(:,:,:) * tmask(:,:,:) 554 #elif defined key_medusa && defined key_foam_medusa553 #elif defined key_medusa 555 554 CALL iom_get( inum, jpdom_autoglo, 'medusa_chn', tracer_bkg(:,:,:,jpchn) ) 556 555 CALL iom_get( inum, jpdom_autoglo, 'medusa_chd', tracer_bkg(:,:,:,jpchd) ) … … 578 577 CALL iom_get( inum, jpdom_autoglo, 'hadocc_dic', tracer_bkg(:,:,:,jp_had_dic) ) 579 578 CALL iom_get( inum, jpdom_autoglo, 'hadocc_alk', tracer_bkg(:,:,:,jp_had_alk) ) 580 #elif defined key_medusa && defined key_foam_medusa579 #elif defined key_medusa 581 580 CALL iom_get( inum, jpdom_autoglo, 'medusa_zmi', tracer_bkg(:,:,:,jpzmi) ) 582 581 CALL iom_get( inum, jpdom_autoglo, 'medusa_zme', tracer_bkg(:,:,:,jpzme) ) … … 594 593 CALL iom_get( inum, jpdom_autoglo, 'hadocc_dic', tracer_bkg(:,:,:,jp_had_dic) ) 595 594 CALL iom_get( inum, jpdom_autoglo, 'hadocc_alk', tracer_bkg(:,:,:,jp_had_alk) ) 596 #elif defined key_medusa && defined key_foam_medusa595 #elif defined key_medusa 597 596 CALL iom_get( inum, jpdom_autoglo, 'medusa_dic', tracer_bkg(:,:,:,jpdic) ) 598 597 CALL iom_get( inum, jpdom_autoglo, 'medusa_alk', tracer_bkg(:,:,:,jpalk) ) … … 620 619 CALL iom_get( inum, jpdom_autoglo, 'hadocc_dic', tracer_bkg(:,:,:,jp_had_dic) ) 621 620 CALL iom_get( inum, jpdom_autoglo, 'hadocc_alk', tracer_bkg(:,:,:,jp_had_alk) ) 622 #elif defined key_medusa && defined key_foam_medusa621 #elif defined key_medusa 623 622 CALL iom_get( inum, jpdom_autoglo, 'medusa_dic', tracer_bkg(:,:,:,jpdic) ) 624 623 CALL iom_get( inum, jpdom_autoglo, 'medusa_alk', tracer_bkg(:,:,:,jpalk) ) … … 690 689 & ln_schltotinc .OR. ln_slphytotinc .OR. ln_slphydiainc .OR. & 691 690 & ln_slphynoninc ) THEN 692 #if defined key_medusa && defined key_foam_medusa691 #if defined key_medusa 693 692 CALL iom_rstput( kt, kt, inum, 'phy2d_chn', phyto2d_balinc(:,:,:,jpchn) ) 694 693 CALL iom_rstput( kt, kt, inum, 'phy2d_chd', phyto2d_balinc(:,:,:,jpchd) ) … … 721 720 722 721 IF ( ln_plchltotinc .OR. ln_pchltotinc ) THEN 723 #if defined key_medusa && defined key_foam_medusa722 #if defined key_medusa 724 723 CALL iom_rstput( kt, kt, inum, 'phy3d_chn', phyto3d_balinc(:,:,:,jpchn) ) 725 724 CALL iom_rstput( kt, kt, inum, 'phy3d_chd', phyto3d_balinc(:,:,:,jpchd) ) … … 733 732 734 733 IF ( ln_spco2inc ) THEN 735 #if defined key_medusa && defined key_foam_medusa734 #if defined key_medusa 736 735 CALL iom_rstput( kt, kt, inum, 'pco2_dic', pco2_balinc(:,:,:,jpdic) ) 737 736 CALL iom_rstput( kt, kt, inum, 'pco2_alk', pco2_balinc(:,:,:,jpalk) ) … … 741 740 #endif 742 741 ELSE IF ( ln_sfco2inc ) THEN 743 #if defined key_medusa && defined key_foam_medusa742 #if defined key_medusa 744 743 CALL iom_rstput( kt, kt, inum, 'fco2_dic', pco2_balinc(:,:,:,jpdic) ) 745 744 CALL iom_rstput( kt, kt, inum, 'fco2_alk', pco2_balinc(:,:,:,jpalk) ) … … 751 750 752 751 IF ( ln_pphinc ) THEN 753 #if defined key_medusa && defined key_foam_medusa752 #if defined key_medusa 754 753 CALL iom_rstput( kt, kt, inum, 'ph_dic', ph_balinc(:,:,:,jpdic) ) 755 754 CALL iom_rstput( kt, kt, inum, 'ph_alk', ph_balinc(:,:,:,jpalk) ) … … 806 805 CALL iom_rstput( kt, nitbkg_r, knum, 'hadocc_chl' , HADOCC_CHL(:,:,:) ) 807 806 CALL iom_rstput( kt, nitbkg_r, knum, 'hadocc_cchl' , cchl_p(:,:,:) ) 808 #elif defined key_medusa && defined key_foam_medusa807 #elif defined key_medusa 809 808 CALL iom_rstput( kt, nitbkg_r, knum, 'pgrow_avg' , pgrow_avg ) 810 809 CALL iom_rstput( kt, nitbkg_r, knum, 'ploss_avg' , ploss_avg ) … … 904 903 REAL(wp), DIMENSION(jpi,jpj) :: zinc_phytot ! Local phytot incs 905 904 REAL(wp), DIMENSION(jpi,jpj) :: zbkg_phytot ! Local phytot bkg 906 #if defined key_medusa && defined key_foam_medusa905 #if defined key_medusa 907 906 REAL(wp), DIMENSION(jpi,jpj) :: zinc_chldia ! Local chldia incs 908 907 REAL(wp), DIMENSION(jpi,jpj) :: zbkg_chldia ! Local chldia bkg … … 924 923 ! Total chlorophyll 925 924 IF ( ln_slchltotinc ) THEN 926 #if defined key_medusa && defined key_foam_medusa925 #if defined key_medusa 927 926 zbkg_chltot(:,:) = tracer_bkg(:,:,1,jpchn) + tracer_bkg(:,:,1,jpchd) 928 927 #elif defined key_hadocc … … 936 935 ENDIF 937 936 938 #if defined key_medusa && defined key_foam_medusa937 #if defined key_medusa 939 938 ! Diatom chlorophyll 940 939 IF ( ln_slchldiainc ) THEN … … 946 945 #endif 947 946 948 #if defined key_medusa && defined key_foam_medusa947 #if defined key_medusa 949 948 ! Non-diatom chlorophyll 950 949 IF ( ln_slchlnoninc ) THEN … … 958 957 ! Total phytoplankton carbon 959 958 IF ( ln_slphytotinc ) THEN 960 #if defined key_medusa && defined key_foam_medusa959 #if defined key_medusa 961 960 zbkg_phytot(:,:) = (trn(:,:,1,jpphn) * xthetapn) + (trn(:,:,1,jpphd) * xthetapd) 962 961 #elif defined key_hadocc … … 968 967 ENDIF 969 968 970 #if defined key_medusa && defined key_foam_medusa969 #if defined key_medusa 971 970 ! Diatom phytoplankton carbon 972 971 IF ( ln_slphydiainc ) THEN … … 978 977 #endif 979 978 980 #if defined key_medusa && defined key_foam_medusa979 #if defined key_medusa 981 980 ! Non-diatom phytoplankton carbon 982 981 IF ( ln_slphynoninc ) THEN … … 990 989 ! Select mixed layer 991 990 IF ( ll_asmdin ) THEN 992 #if defined key_top && ( defined key_hadocc || (defined key_medusa && defined key_foam_medusa))991 #if defined key_top && ( defined key_hadocc || defined key_medusa ) 993 992 CALL ctl_warn( ' Doing direct initialisation with ocean colour assimilation', & 994 993 & ' Mixed layer depth taken to be background maximum mld_max_bkg' ) … … 1026 1025 zincper = (nitiaufin_r - nitiaustr_r + 1) * rdt 1027 1026 1028 #if defined key_medusa && defined key_foam_medusa1027 #if defined key_medusa 1029 1028 CALL asm_phyto2d_bal_medusa( (ln_slchltotinc .OR. ln_schltotinc), & 1030 1029 & zinc_chltot, & … … 1084 1083 ! Add directly to trn and trb, rather than to tra, because tra gets 1085 1084 ! reset to zero at the start of trc_stp, called after this routine 1086 #if defined key_medusa && defined key_foam_medusa1085 #if defined key_medusa 1087 1086 WHERE( phyto2d_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp .OR. & 1088 1087 & trn(:,:,:,jp_msa0:jp_msa1) + phyto2d_balinc(:,:,:,jp_msa0:jp_msa1) * zincwgt > 0.0_wp ) … … 1120 1119 CALL ctl_warn( ' Doing direct initialisation with phyto2d assimilation', & 1121 1120 & ' Background state is taken from model rather than background file' ) 1122 #if defined key_medusa && defined key_foam_medusa1121 #if defined key_medusa 1123 1122 WHERE( phyto2d_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp .OR. & 1124 1123 & trn(:,:,:,jp_msa0:jp_msa1) + phyto2d_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp ) … … 1187 1186 ! 3) Subtract background from analysis to get chl incs 1188 1187 ! If rn_maxchlinc > 0 then cap total absolute chlorophyll increment at that value 1189 #if defined key_medusa && defined key_foam_medusa1188 #if defined key_medusa 1190 1189 bkg_chl(:,:,:) = tracer_bkg(:,:,:,jpchn) + tracer_bkg(:,:,:,jpchd) 1191 1190 #elif defined key_hadocc … … 1220 1219 ENDIF 1221 1220 1222 #if defined key_medusa && defined key_foam_medusa1221 #if defined key_medusa 1223 1222 ! Loop over each grid point partioning the increments based on existing ratios 1224 1223 DO jk = 1, jpk … … 1271 1270 ! Add directly to trn and trb, rather than to tra, because tra gets 1272 1271 ! reset to zero at the start of trc_stp, called after this routine 1273 #if defined key_medusa && defined key_foam_medusa1272 #if defined key_medusa 1274 1273 WHERE( phyto3d_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp .OR. & 1275 1274 & trn(:,:,:,jp_msa0:jp_msa1) + phyto3d_balinc(:,:,:,jp_msa0:jp_msa1) * zincwgt > 0.0_wp ) … … 1307 1306 CALL ctl_warn( ' Doing direct initialisation with phyto3d assimilation', & 1308 1307 & ' Background state is taken from model rather than background file' ) 1309 #if defined key_medusa && defined key_foam_medusa1308 #if defined key_medusa 1310 1309 WHERE( phyto3d_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp .OR. & 1311 1310 & trn(:,:,:,jp_msa0:jp_msa1) + phyto3d_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp ) … … 1388 1387 1389 1388 IF ( ln_sfco2inc ) THEN 1390 #if defined key_medusa && defined key_ foam_medusa && defined key_roam1389 #if defined key_medusa && defined key_roam 1391 1390 ! If assimilating fCO2, then convert to pCO2 using MEDUSA MOCSY subroutine 1392 1391 patm(1) = 1.0 … … 1421 1420 ENDIF 1422 1421 1423 #if defined key_medusa && defined key_foam_medusa1422 #if defined key_medusa 1424 1423 ! Account for phytoplankton balancing if required 1425 1424 IF ( ln_phytobal ) THEN … … 1456 1455 ! Select mixed layer 1457 1456 IF ( ll_asmdin ) THEN 1458 #if defined key_hadocc || (defined key_medusa && defined key_foam_medusa)1457 #if defined key_hadocc || defined key_medusa 1459 1458 CALL ctl_warn( ' Doing direct initialisation with pCO2 assimilation', & 1460 1459 & ' Mixed layer depth taken to be background maximum mld_max_bkg' ) … … 1541 1540 ! Add directly to trn and trb, rather than to tra, because tra gets 1542 1541 ! reset to zero at the start of trc_stp, called after this routine 1543 #if defined key_medusa && defined key_foam_medusa1542 #if defined key_medusa 1544 1543 WHERE( pco2_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp .OR. & 1545 1544 & trn(:,:,:,jp_msa0:jp_msa1) + pco2_balinc(:,:,:,jp_msa0:jp_msa1) * zincwgt > 0.0_wp ) … … 1578 1577 CALL ctl_warn( ' Doing direct initialisation with pCO2 assimilation', & 1579 1578 & ' Background state is taken from model rather than background file' ) 1580 #if defined key_medusa && defined key_foam_medusa1579 #if defined key_medusa 1581 1580 WHERE( pco2_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp .OR. & 1582 1581 & trn(:,:,:,jp_msa0:jp_msa1) + pco2_balinc(:,:,:,jp_msa0:jp_msa1) > 0.0_wp ) … … 1649 1648 !!------------------------------------------------------------------------ 1650 1649 1651 #if ! (defined key_medusa && defined key_foam_medusa)1650 #if ! defined key_medusa 1652 1651 CALL ctl_stop( ' pH balancing only implemented for MEDUSA' ) 1653 1652 #else … … 1858 1857 1859 1858 IF ( ln_pno3inc ) THEN 1860 #if defined key_hadocc || ( defined key_medusa && defined key_foam_medusa )1859 #if defined key_hadocc || defined key_medusa 1861 1860 #if defined key_hadocc 1862 1861 it = jp_had_nut 1863 #elif defined key_medusa && defined key_foam_medusa1862 #elif defined key_medusa 1864 1863 it = jpdin 1865 1864 #endif … … 1882 1881 1883 1882 IF ( ln_psi4inc ) THEN 1884 #if defined key_medusa && defined key_foam_medusa1883 #if defined key_medusa 1885 1884 it = jpsil 1886 1885 IF ( ln_phytobal ) THEN … … 1902 1901 1903 1902 IF ( ln_pdicinc ) THEN 1904 #if defined key_hadocc || ( defined key_medusa && defined key_foam_medusa )1903 #if defined key_hadocc || defined key_medusa 1905 1904 #if defined key_hadocc 1906 1905 it = jp_had_dic 1907 #elif defined key_medusa && defined key_foam_medusa1906 #elif defined key_medusa 1908 1907 it = jpdic 1909 1908 #endif … … 1926 1925 1927 1926 IF ( ln_palkinc ) THEN 1928 #if defined key_hadocc || ( defined key_medusa && defined key_foam_medusa )1927 #if defined key_hadocc || defined key_medusa 1929 1928 #if defined key_hadocc 1930 1929 it = jp_had_alk 1931 #elif defined key_medusa && defined key_foam_medusa1930 #elif defined key_medusa 1932 1931 it = jpalk 1933 1932 #endif … … 1950 1949 1951 1950 IF ( ln_po2inc ) THEN 1952 #if defined key_medusa && defined key_foam_medusa1951 #if defined key_medusa 1953 1952 it = jpoxy 1954 1953 IF ( ln_phytobal ) THEN … … 2002 2001 trb(:,:,:,jp_had_nut) = trb(:,:,:,jp_had_nut) + pno3_bkginc(:,:,:) * zincwgt 2003 2002 END WHERE 2004 #elif defined key_medusa && defined key_foam_medusa2003 #elif defined key_medusa 2005 2004 WHERE( pno3_bkginc(:,:,:) > 0.0_wp .OR. & 2006 2005 & trn(:,:,:,jpdin) + pno3_bkginc(:,:,:) * zincwgt > 0.0_wp ) … … 2014 2013 2015 2014 IF ( ln_psi4inc ) THEN 2016 #if defined key_medusa && defined key_foam_medusa2015 #if defined key_medusa 2017 2016 WHERE( psi4_bkginc(:,:,:) > 0.0_wp .OR. & 2018 2017 & trn(:,:,:,jpsil) + psi4_bkginc(:,:,:) * zincwgt > 0.0_wp ) … … 2032 2031 trb(:,:,:,jp_had_dic) = trb(:,:,:,jp_had_dic) + pdic_bkginc(:,:,:) * zincwgt 2033 2032 END WHERE 2034 #elif defined key_medusa && defined key_foam_medusa2033 #elif defined key_medusa 2035 2034 WHERE( pdic_bkginc(:,:,:) > 0.0_wp .OR. & 2036 2035 & trn(:,:,:,jpdic) + pdic_bkginc(:,:,:) * zincwgt > 0.0_wp ) … … 2050 2049 trb(:,:,:,jp_had_alk) = trb(:,:,:,jp_had_alk) + palk_bkginc(:,:,:) * zincwgt 2051 2050 END WHERE 2052 #elif defined key_medusa && defined key_foam_medusa2051 #elif defined key_medusa 2053 2052 WHERE( palk_bkginc(:,:,:) > 0.0_wp .OR. & 2054 2053 & trn(:,:,:,jpalk) + palk_bkginc(:,:,:) * zincwgt > 0.0_wp ) … … 2062 2061 2063 2062 IF ( ln_po2inc ) THEN 2064 #if defined key_medusa && defined key_foam_medusa2063 #if defined key_medusa 2065 2064 WHERE( po2_bkginc(:,:,:) > 0.0_wp .OR. & 2066 2065 & trn(:,:,:,jpoxy) + po2_bkginc(:,:,:) * zincwgt > 0.0_wp ) … … 2098 2097 CALL ctl_warn( ' Doing direct initialisation of HadOCC with 3D BGC assimilation', & 2099 2098 & ' Background state is taken from model rather than background file' ) 2100 #elif defined key_medusa && defined key_foam_medusa2099 #elif defined key_medusa 2101 2100 CALL ctl_warn( ' Doing direct initialisation of MEDUSA with 3D BGC assimilation', & 2102 2101 & ' Background state is taken from model rather than background file' ) … … 2110 2109 trb(:,:,:,jp_had_nut) = trn(:,:,:,jp_had_nut) 2111 2110 END WHERE 2112 #elif defined key_medusa && defined key_foam_medusa2111 #elif defined key_medusa 2113 2112 WHERE( pno3_bkginc(:,:,:) > 0.0_wp .OR. & 2114 2113 & trn(:,:,:,jpdin) + pno3_bkginc(:,:,:) > 0.0_wp ) … … 2122 2121 2123 2122 IF ( ln_psi4inc ) THEN 2124 #if defined key_medusa && defined key_foam_medusa2123 #if defined key_medusa 2125 2124 WHERE( psi4_bkginc(:,:,:) > 0.0_wp .OR. & 2126 2125 & trn(:,:,:,jpsil) + psi4_bkginc(:,:,:) > 0.0_wp ) … … 2140 2139 trb(:,:,:,jp_had_dic) = trn(:,:,:,jp_had_dic) 2141 2140 END WHERE 2142 #elif defined key_medusa && defined key_foam_medusa2141 #elif defined key_medusa 2143 2142 WHERE( pdic_bkginc(:,:,:) > 0.0_wp .OR. & 2144 2143 & trn(:,:,:,jpdic) + pdic_bkginc(:,:,:) > 0.0_wp ) … … 2158 2157 trb(:,:,:,jp_had_alk) = trn(:,:,:,jp_had_alk) 2159 2158 END WHERE 2160 #elif defined key_medusa && defined key_foam_medusa2159 #elif defined key_medusa 2161 2160 WHERE( palk_bkginc(:,:,:) > 0.0_wp .OR. & 2162 2161 & trn(:,:,:,jpalk) + palk_bkginc(:,:,:) > 0.0_wp ) … … 2170 2169 2171 2170 IF ( ln_po2inc ) THEN 2172 #if defined key_medusa && defined key_foam_medusa2171 #if defined key_medusa 2173 2172 WHERE( po2_bkginc(:,:,:) > 0.0_wp .OR. & 2174 2173 & trn(:,:,:,jpoxy) + po2_bkginc(:,:,:) > 0.0_wp )
Note: See TracChangeset
for help on using the changeset viewer.