SUBROUTINE ice_bio_ini(kideb,kiut,nlay_i) ! !------------------------------------------------------------------------------! ! ! This routine initializes biogeochemical tracers ! (c) Martin Vancoppenolle, Oct 2014 ! ! version: 3.04 ! !------------------------------------------------------------------------------! ! INCLUDE 'type.com' INCLUDE 'para.com' INCLUDE 'const.com' INCLUDE 'ice.com' INCLUDE 'thermo.com' INCLUDE 'bio.com' INTEGER :: & ji , ! : index for space & jk , ! : index for ice layers & jn , ! : index for tracers & numtra = 700, ! : reference number for bio.param & n_raw ! : number of values in the raw initial profile REAL(4) zini(1) ! forcing field dummy array REAL(8), DIMENSION(maxnlay) :: & z_raw, & zq_raw, & zc_raw, & zq1, & zdh_bio REAL(8), DIMENSION(maxnlay+2) :: & zdh_raw REAL(8), DIMENSION(0:maxnlay) :: & zb_raw CHARACTER(len=61) :: & zblank CHARACTER(len=10) :: & filenc='init.nc' CHARACTER(len=3) :: & zchar LOGICAL :: & ln_initfile = .FALSE. zblank = & ' ' ji = 1 !------------------------------------------------------------------------------! WRITE(numout,*) ' ** ice_bio_ini : ' WRITE(numout,*) ' ~~~~~~~~~~~~~~~~ ' WRITE(numout,*) IF ( c_bio_model .EQ. 'KRILL' ) THEN ntra_bio = 23 ENDIF ! !-----------------------------------------------------------------------------! ! 1) Create grid and interpolate physical variables !-----------------------------------------------------------------------------! ! CALL ice_bio_grid(kideb,kiut,nlay_i,.TRUE.) ! Biological grid CALL ice_bio_interp_phy2bio(kideb,kiut,nlay_i, .FALSE.) ! Physical fields ! on the bio grid ! !-----------------------------------------------------------------------------! ! 2) Initialize tracer numbers and names !-----------------------------------------------------------------------------! ! WRITE(numout,*) ' Initialize tracers... ' WRITE(numout,*) ! Set default tracer values layer_00 = 1 cbu_i_bio(:,:) = 0. cbub_i_bio(:,:) = 0. ; c_gtot_i(:,:) = 0. c_w_bio(:) = 0. ; mixr_gas(:) = 0. dmol_gas(:) = 0. ; f_ads(:) = 0. flag_active(:) = .false. ! Activated ? flag_diff(:) = .false. ! Diffused ? nn_remp(:) = 1 ! Squeezing remaping biotr_i_nam(:) = 'xxx'//zblank ! Name of the tracer biotr_i_typ(:) = 'xxx'//zblank ! Type = algal biotr_i_uni(:) = 'xxx'//zblank ! Units nn_init(:) = 1 ! Compute layer limits IF ( ( c_grid .EQ. 'SL' ) .OR. ( c_grid .EQ. 'BA' ) ) & layer_00 = nlay_bio ! Assign Tracer Numbers jn_dsi = 1 jn_din = 2 jn_dip = 3 jn_aoc = 4 jn_eoc = 5 jn_co2 = 6 ! 20 jn_dic = 7 ! 12 jn_alk = 8 ! 13 jn_ika = 9 ! 14 jn_oxy = 10 ! 15 jn_nit = 11 ! 16 jn_arg = 12 ! 17 jn_cal = 13 ! 21 jn_aon = 14 jn_eon = 15 jn_aop = 16 jn_eop = 17 ! Assign Tracer names biotr_i_nam(jn_dsi) = 'dSi'//zblank biotr_i_nam(jn_din) = 'dIN'//zblank biotr_i_nam(jn_dip) = 'dIP'//zblank biotr_i_nam(jn_aoc) = 'AoC'//zblank biotr_i_nam(jn_eoc) = 'eoC'//zblank biotr_i_nam(jn_co2) = 'CO2'//zblank biotr_i_nam(jn_dic) = 'DIC'//zblank biotr_i_nam(jn_alk) = 'Alk'//zblank biotr_i_nam(jn_ika) = 'Ika'//zblank biotr_i_nam(jn_cal) = 'Cal'//zblank biotr_i_nam(jn_arg) = 'Arg'//zblank biotr_i_nam(jn_oxy) = 'Oxy'//zblank biotr_i_nam(jn_nit) = 'Nit'//zblank biotr_i_nam(jn_aon) = 'AoN'//zblank biotr_i_nam(jn_eon) = 'eoN'//zblank biotr_i_nam(jn_aop) = 'AoP'//zblank biotr_i_nam(jn_eop) = 'eoP'//zblank ! !-----------------------------------------------------------------------------! ! 3) Read tracer parameters !-----------------------------------------------------------------------------! ! WRITE(numout,*) ' Tracer parameters ... ' WRITE(numout,*) OPEN( unit = numtra , file='tracer.param', status='old' ) ! initial values READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) READ(numtra,*) DO jn_read = 1, 17 READ(numtra,*) c_read_name(jn_read), zchar, i_dummy1, zdummy2, & zdummy3, zdummy4, zdummy5, zdummy6 DO jn = 1, ntra_bio IF ( c_read_name(jn_read)//zblank .EQ. biotr_i_nam(jn) ) THEN c_nc_name(jn) = zchar nn_init(jn) = i_dummy1 cbu_i_nml(jn) = zdummy2 c_w_bio(jn) = zdummy3 mixr_gas(jn) = zdummy4 dmol_gas(jn) = zdummy5 f_ads(jn) = zdummy6 ENDIF END DO ENDDO CLOSE( numtra ) WRITE(numout,*) DO jn = 1, ntra_bio WRITE(numout,*) biotr_i_nam(jn), nn_init(jn) , cbu_i_nml(jn), & c_w_bio(jn) , mixr_gas(jn), dmol_gas(jn), & f_ads(jn) END DO ! !-----------------------------------------------------------------------------! ! 4) Parameterize tracer behaviour !-----------------------------------------------------------------------------! ! ! flag_active determines a tracer is activated in the code ! flag_diff tells whether a tracer should be diffused with brine or not ! nn_remp gives the type of remapping - 1 = linear remapping (very diffusive); 2 = "squeezing remapping" ! biotr_i_typ can be either - only gas is useful because flag_diff makes the difference between solutes and particles ! - 'sol' -> solute (like salt) ! - 'prc' -> particulate (e.g. organic matter) ! - 'gas' -> gas !------------------------ ! DSi : Dissolved silica !------------------------ jn = jn_dsi flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'sol'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !------------------------------------ ! DIN : dissolved inorganic nitrogen !------------------------------------ jn = jn_din flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'sol'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !---------------------------- ! DIP : Dissolved phosphorus !---------------------------- jn = jn_dip ! Units = ( mmole PO4 m-3 ) or ( micrmol PO4 l-1 ) flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'sol'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! AoC : Ice algae organic carbon !-------------------------------------- jn = jn_aoc flag_active(jn) = .true. flag_diff(jn) = .false. nn_remp(jn) = 2 biotr_i_typ(jn) = 'prc'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! eoC : Detritus organic Carbon !-------------------------------------- jn = jn_eoc flag_active(jn) = .true. flag_diff(jn) = .false. nn_remp(jn) = 2 biotr_i_typ(jn) = 'prc'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! AoN : Ice algae organic N !-------------------------------------- jn = jn_aon flag_active(jn) = .true. flag_diff(jn) = .false. nn_remp(jn) = 2 biotr_i_typ(jn) = 'prc'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! eoN : Detritus organic N !-------------------------------------- jn = jn_eon flag_active(jn) = .true. flag_diff(jn) = .false. nn_remp(jn) = 2 biotr_i_typ(jn) = 'prc'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! AoP : Ice algae organic P !-------------------------------------- jn = jn_aop flag_active(jn) = .true. flag_diff(jn) = .false. nn_remp(jn) = 2 biotr_i_typ(jn) = 'prc'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! eoP : Detritus organic P !-------------------------------------- jn = jn_eop flag_active(jn) = .true. flag_diff(jn) = .false. nn_remp(jn) = 2 biotr_i_typ(jn) = 'prc'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! DIC : Dissolved Inorganic Carbon !-------------------------------------- jn = jn_dic flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'sol'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! Alk : Total Alkalinity !-------------------------------------- jn = jn_alk flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'sol'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! CO2 : aqueous CO2 !-------------------------------------- jn = jn_co2 flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'gas'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! Ika : Ikaite !-------------------------------------- jn = jn_ika flag_active(jn) = .true. flag_diff(jn) = .false. nn_remp(jn) = 1 biotr_i_typ(jn) = 'prc'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! Cal : Ca2+ !-------------------------------------- jn = jn_cal flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'prc'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! Arg : ARgon !-------------------------------------- jn = jn_arg flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'gas'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! Oxy : Oxygen !-------------------------------------- jn = jn_oxy flag_active(jn) = .true. flag_diff(jn) = .true. nn_remp(jn) = 1 biotr_i_typ(jn) = 'gas'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank !-------------------------------------- ! Nit : N2 !-------------------------------------- jn = jn_nit flag_active(jn) = .false. flag_diff(jn) = .false. nn_remp(jn) = 1 biotr_i_typ(jn) = 'gas'//zblank biotr_i_uni(jn) = 'mmol_m3'//zblank ! !-----------------------------------------------------------------------------! ! 5) Prepare Netcdf Interpolation if required !-----------------------------------------------------------------------------! ! DO jn = 1, ntra_bio IF ( flag_active (jn) .AND. ( nn_init(jn) == 3 ) ) & ln_initfile = .TRUE. END DO IF ( ln_initfile ) THEN !--- Open file !-------------- CALL CF_OPEN (filenc,id) ! open forcing file CALL CF_READ1D ( filenc, 'nlay', 1, 1, zini ) ! number of layers n_raw = zini(1) DO layer = 1, n_raw ! raw grid CALL CF_READ1D ( filenc, 'z_i', layer, 1, zini) z_raw(layer) = zini(1) END DO zb_raw(:) = 0.0 ! layer interfaces DO layer = 1, n_raw - 1 zb_raw(layer) = ( z_raw(layer) + z_raw(layer+1) ) / 2. END DO zb_raw(n_raw) = ht_i_b(ji) zdh_raw(:) = 0. ! layer thicknesses DO layer = 1, n_raw zdh_raw(layer) = zb_raw(layer) - zb_raw(layer-1) END DO zdh_bio(:) = 0. zdh_bio(1:nlay_bio) = deltaz_i_bio(:) ENDIF !-------------------------------------- ! Assign ice concentrations to cbu_i !-------------------------------------- DO jn = 1, ntra_bio IF ( flag_active(jn) ) THEN IF ( nn_init(jn) .EQ. 1 ) !--- Initialization conserves namelist concentration & cbu_i_bio(jn,layer_00:nlay_bio) = cbu_i_nml(jn) IF ( nn_init(jn) .EQ. 2 ) THEN !--- Initialization conserves namelist concentration times thickness zstock = cbu_i_nml(jn) * ht_i_b(ji) cbu_i_bio(jn,layer_00:nlay_bio) = zstock / h_bio ENDIF IF ( nn_init(jn) .EQ. 3 ) THEN !--- Profile read from nc file DO layer = 1, n_raw CALL CF_READ1D ( filenc, c_nc_name(jn), layer, 1, zini ) zc_raw(layer) = zini(1) END DO zq_raw(1:n_raw) = zc_raw(1:n_raw) * zdh_raw(1:n_raw) CALL ice_phy_relay( n_raw , nlay_bio , 1 , 1 , & zdh_raw, zdh_bio, zq_raw , zq1 ) cbu_i_bio(jn,1:nlay_bio) = zq1(1:nlay_bio) / & deltaz_i_bio(1:nlay_bio) ENDIF ENDIF END DO IF ( ln_initfile ) & CALL CF_CLOSE (filenc) ! close forcing file ! !-----------------------------------------------------------------------------! ! 7) Chl-a (mg/m3) !-----------------------------------------------------------------------------! ! c_molar = 12. ! molar mass of carbon DO layer = 1, nlay_bio chla_i_bio(layer) = cbu_i_bio(4,layer) * chla_c * c_molar END DO ! !-----------------------------------------------------------------------------! ! 8) Zero un used tracers !-----------------------------------------------------------------------------! ! IF ( nn_bio_opt .EQ. 0 ) THEN cbu_i_bio(jn_eoc,:) = 0.0 flag_active(jn_eoc) = .FALSE. flag_diff(jn_eoc) = .FALSE. c_w_bio(jn_eoc) = 0. mixr_gas(jn_eoc) = 0. dmol_gas(jn_eoc) = 0. ENDIF ! !-----------------------------------------------------------------------------! ! 9) Control prints !-----------------------------------------------------------------------------! ! WRITE(numout,*) ' *** Initial values *** ' WRITE(numout,*) DO jn = 1, ntra_bio IF ( flag_active(jn) ) THEN WRITE(numout,*) ' Tracer : ', biotr_i_nam(jn) WRITE(numout,*) ' ~~~~~~~ ' WRITE(numout,*) ' Type : ', biotr_i_typ(jn) WRITE(numout,*) ' cbu_i_bio : ', ( cbu_i_bio(jn,jk), & jk = 1, nlay_bio ) WRITE(numout,*) ' c_w_bio : ', c_w_bio(jn) WRITE(numout,*) ENDIF END DO ! jn WRITE(numout,*) ' Chla ' WRITE(numout,*) ' ~~~~ ' WRITE(numout,*) ' chla_i_bio : ', & ( chla_i_bio(layer), layer = 1, nlay_bio ) WRITE(numout,*) WRITE(numout,*) ' End of ice_bio_ini ' WRITE(numout,*) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' ! !-----------------------------------------------------------------------------! !-- End of ice_bio_ini -- RETURN END