Closed HyunChaeJung closed 1 year ago
src/coupler/flux_exchange.F90 : subroutine flux_down_from_atmos
subroutine flux_down_from_atmos (Time, Atm, Land, Ice, &
Atmos_boundary, Land_boundary, Ice_boundary )
....
do tr = 1,n_exch_tr
where(ex_avail)
ex_gamma = 1.0 / (1.0 - ex_dtmass*(ex_dflux_tr(:,tr) + ex_dfdtr_atm(:,tr)))
ex_e_tr_n(:,tr) = ex_dtmass*ex_dfdtr_surf(:,tr)*ex_gamma
ex_f_tr_delt_n(:,tr) = (ex_delta_tr(:,tr)+ex_dtmass*ex_flux_tr(:,tr))*ex_gamma
ex_flux_tr(:,tr) = ex_flux_tr(:,tr) + ex_dfdtr_atm(:,tr)*ex_f_tr_delt_n(:,tr)
ex_dfdtr_surf(:,tr) = ex_dfdtr_surf(:,tr) + ex_dfdtr_atm(:,tr)*ex_e_tr_n(:,tr)
endwhere
enddo
....
Land_boundary%tr_flux(:,:,:,:) = 0.0
Land_boundary%dfdtr(:,:,:,:) = 0.0
do tr = 1,n_exch_tr
n = tr_table(tr)%lnd
if(n /= NO_TRACER ) then
call get_from_xgrid (Land_boundary%tr_flux(:,:,:,n), 'LND', ex_flux_tr(:,tr), xmap_sfc)
call get_from_xgrid (Land_boundary%dfdtr(:,:,:,n), 'LND', ex_dfdtr_surf(:,tr), xmap_sfc)
#ifdef SCM
if (do_specified_land .and. do_specified_flux .and. tr.eq.isphum) then
call get_from_xgrid (Land_boundary%dfdtr(:,:,:,n), 'LND', ex_dedq_surf_forland(:), xmap_sfc)
endif
#endif
endif
enddo
~/Models/MOM5-TOPAZ/src/coupler$ vi flux_exchange.F90 subroutine sfc_boundary_layer ( dt, Time, Atm, Land, Ice, Land_Ice_Atmos_Boundary )
! Before using data_override a data_table must be created with the following entries: ! gridname, fieldname_code, fieldname_file, file_name, ongrid, factor.
<-------여기서 deposition data 읽어서 가는듯.
! data override for co2 to be passed to ocean (co2_flux_pcair_atm)
! atmos_co2.F90 already called: converts tr_bot passed to ocean via gas_flux
! from moist mmr to dry vmr.
do n = 1, atm%fields%num_bcs !{
do m = 1, atm%fields%bc(n)%num_fields !{
**call data_override('ATM', atm%fields%bc(n)%field(m)%name, &
atm%fields%bc(n)%field(m)%values, Time, override = atm%fields%bc(n)%field(m)%override)**
ex_gas_fields_atm%bc(n)%field(m)%override = atm%fields%bc(n)%field(m)%override
enddo !} m
enddo !} n
do n = 1, atm%fields%num_bcs !{
if (atm%fields%bc(n)%use_atm_pressure) then !{
if (.not. atm%fields%bc(n)%field(ind_psurf)%override) then !{
atm%fields%bc(n)%field(ind_psurf)%values = Atm%p_surf
endif !}
endif !}
enddo !} n
<---------- 여기서 위에서 읽은 dop data(Atm%fields%bc(n)%field(m)%values) -> ex_gas_fields_atm%bc(n)%field(m)%values
do n = 1, Atm%fields%num_bcs !{
do m = 1, Atm%fields%bc(n)%num_fields !{
**call put_to_xgrid (Atm%fields%bc(n)%field(m)%values, 'ATM', &
ex_gas_fields_atm%bc(n)%field(m)%values, xmap_sfc, remap_method=remap_method, complete=.false.)**
enddo !} m
enddo !} n
<------------- 여기서 air-sea flux, wet/dry dep, runoff flux 등등을 계산함
! Combine explicit ocean flux and implicit land flux of extra flux fields.
! Calculate ocean explicit flux here
**call atmos_ocean_fluxes_calc(ex_gas_fields_atm, ex_gas_fields_ice, ex_gas_fluxes, ex_seawater)**
MASS RUNOFF : ~/src/mom5/ocean_core/ocean_sbc.F90
! water flux in (kg/m^3)*(m/s) from liquid runoff and calving land ice
do j = jsc_bnd,jec_bnd
do i = isc_bnd,iec_bnd
ii = i + i_shift
jj = j + j_shift
runoff(ii,jj) = Ice_ocean_boundary%runoff(i,j)*Grd%tmask(ii,jj,1)
calving(ii,jj) = Ice_ocean_boundary%calving(i,j)*Grd%tmask(ii,jj,1)
enddo
enddo
if(use_ideal_runoff) then
do j=jsc,jec
do i=isc,iec
runoff(i,j) = runoff(i,j) + ideal_runoff(i,j)
enddo
enddo
endif
if(use_ideal_calving) then
do j=jsc,jec
do i=isc,iec
calving(i,j) = calving(i,j) + ideal_calving(i,j)
enddo
enddo
endif
if(runoffspread) call spread_river_horz(runoff)
if(calvingspread) call spread_river_horz(calving)
! river=runoff+calving is the water mass flux
! entering ocean, other than through pme.
! calving is immediately melted, so it is appropriate
! to add it to runoff for purposes of getting a mass
! flux of liquid, from land, into the ocean.
if(waterflux_tavg) then
do j=jsc,jec
do i=isc,iec
river(i,j) = 0.5*river_taum1(i,j)
river_taum1(i,j) = runoff(i,j) + calving(i,j)
river(i,j) = river(i,j) + 0.5*river_taum1(i,j)
enddo
enddo
else
do j=jsc,jec
do i=isc,iec
river(i,j) = runoff(i,j) + calving(i,j)
enddo
enddo
endif
TOPAZ tracer runoff 계산 : ./mom5/ocean_bgc/ocean_generic_tracer.F90 -
subroutine ocean_generic_sbc(Ice_ocean_boundary_fluxes,Disd,Djsd, T_prog, runoff )
...
do
if(g_tracer_is_prog(g_tracer)) then
call g_tracer_get_alias(g_tracer,g_tracer_name)
g_tracer_index = fm_get_index(trim('/ocean_mod/prog_tracers/'//g_tracer_name))
if (g_tracer_index .le. 0) &
call mpp_error(FATAL,trim(sub_name) // ' Could not get the index for '//g_tracer_name)
if (_ALLOCATED(g_tracer%stf) )&
call g_tracer_get_values(g_tracer,g_tracer_name,'stf', T_prog(g_tracer_index)%stf, Disd,Djsd)
if (_ALLOCATED(g_tracer%btf) )&
call g_tracer_get_values(g_tracer,g_tracer_name,'btf', T_prog(g_tracer_index)%btf, Disd,Djsd)
!If the tracer has runoff fill in the T_prog(n)%trunoff and T_prog(n)%runoff_tracer_flux
if(_ALLOCATED(g_tracer%trunoff)) then
!Fill in T_prog(n)%trunoff
call g_tracer_get_values(g_tracer,g_tracer_name,'trunoff',T_prog(g_tracer_index)%trunoff,Disd,Djsd)
!Fill in T_prog(n)%runoff_tracer_flux
T_prog(g_tracer_index)%runoff_tracer_flux = T_prog(g_tracer_index)%trunoff * runoff
!Set g_tracer%runoff_tracer_flux
call g_tracer_set_values(g_tracer,g_tracer_name,'runoff_tracer_flux',T_prog(g_tracer_index)%runoff_tracer_flux,Disd,Djsd)
!
!Fill in T_prog(n)%triver in MOM
!Note: This is done so that MOM can apply the river fluxes through setting either
! the runoff and calving fluxes (when discharge_combine_runoff_calve=.false.)
! or
! the total river concentration (when discharge_combine_runoff_calve=.true.)
!
!Assume zero calving flux for the generic tracers.
!T_prog(g_tracer_index)%tcalving = 0 !MOM default
T_prog(g_tracer_index)%triver = T_prog(g_tracer_index)%trunoff
endif
endif
...
TOPAZ river runoff 추적
src/ocean_shared/generic_tracers/generic_tracer_utils.F90
subroutine extract_coupler_values ...... type(coupler_2d_bc_type), intent(in) :: BC_struc Array_in => BC_struc%bc(BC_index)%field(BC_element)%values
do j=js0,je0 ; do i=is0,ie0 array_out(i,j) = conv * Array_in(i+i_offset,j+j_offset) enddo ; enddo ......
"OCN", "runoff_no3_flux_ice_ocn", "DIN_PRSN_CM2","./INPUT/green_etal_regrid_v4.nc",.false.,1.0e-3 "OCN", "runoff_nh4_flux_ice_ocn", "DON_PRSN_CM2","./INPUT/green_etal_regrid_v4.nc",.false.,1.0e-3 "OCN", "runoff_fed_flux_ice_ocn", "" , "" , .false. , 0.0 "OCN", "runoff_alk_flux_ice_ocn", "" , "" , .false. , 0.48e-3 "OCN", "runoff_dic_flux_ice_ocn", "" , "" , .false. , 0.24e-3 "OCN", "runoff_lith_flux_ice_ocn", "" , "" , .false. , 13.0e-3