Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module bgp_to_bgc_weekly_initial_module
- use shr_kind_module, only: r8 => shr_kind_r8
- implicit none
- private
- !---------------------------------------------------------------------------------------------------------
- ! Weekly (Accumulation) initial variables
- !---------------------------------------------------------------------------------------------------------
- real(r8), dimension(:,:,:), allocatable :: c_litter_ag_lf_weekly ! Weekly Above ground leaf litter
- real(r8), dimension(:,:,:), allocatable :: c_litter_ag_wd_weekly ! Weekly abive ground wood litter
- real(r8), dimension(:,:,:), allocatable :: c_litter_bg_weekly ! Weekly Below ground litter
- real(r8), dimension(:,:,:), allocatable :: c_litter_bg_fr_weekly ! Weekly Below ground fine litter
- real(r8), dimension(:,:,:), allocatable :: c_litter_bg_cr_weekly ! Weekly Below ground coarse litter
- real(r8), dimension(:,:,:), allocatable :: c_litter_ag_lf_n_weekly ! Weekly Below ground leaf litter N
- real(r8), dimension(:,:,:), allocatable :: c_litter_ag_wd_n_weekly ! Weekly Below ground wood litter N
- real(r8), dimension(:,:,:), allocatable :: c_litter_bg_fr_n_weekly ! Weekly Below ground fine litter N
- real(r8), dimension(:,:,:), allocatable :: c_litter_bg_cr_n_weekly ! Weekly Below ground coarse litter N
- real(r8), dimension(:,:,:), allocatable :: c_npp_weekly ! Weekly NPP
- contains
- !===========================================================================================================
- ! SUBROUTINE bgp_to_bgc_weekly_initial
- !===========================================================================================================
- subroutine bgp_to_bgc_weekly_initialize()
- use isam_domain, only: myigp_begin, myigp_end, myigp_num
- implicit none
- integer :: ierr !< Local error value
- ! weekly values, for each PFT pool
- allocate(c_litter_ag_lf_weekly (myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_litter_ag_wd_weekly (myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_litter_bg_weekly (myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_litter_bg_fr_weekly (myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_litter_bg_cr_weekly (myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_litter_ag_lf_n_weekly(myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_litter_ag_wd_n_weekly(myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_litter_bg_fr_n_weekly(myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_litter_bg_cr_n_weekly(myigp_begin:myigp_end,numpft,52), stat=ierr)
- allocate(c_npp_weekly (myigp_begin:myigp_end,numpft,52), stat=ierr)
- end subroutine bgp_to_bgc_weekly_initialize
- subroutine bgp_to_bgc_weekly_write()
- call write_weekly_pft_file('Writing leaf litter file', &
- bgp_to_bgc_initial_litter_ag_lf_nc_file, &
- 'c_litter_ag_lf_weekly', 'Weekly above ground leaf litter', 'gC/m2/wk', &
- c_litter_ag_lf_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC wood litter file', &
- bgp_to_bgc_initial_litter_ag_wd_nc_file, &
- 'c_litter_ag_wd_weekly', 'Weekly above ground wood litter', 'gC/m2/wk', &
- c_litter_ag_wd_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC total BG litter file', &
- bgp_to_bgc_initial_litter_bg_nc_file, &
- 'c_litter_bg_weekly', 'Weekly below ground litter', 'gC/m2/wk', &
- c_litter_bg_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC fine root litter file', &
- bgp_to_bgc_initial_litter_bg_fr_nc_file, &
- 'c_litter_bg_fr_weekly', 'Weekly below ground fine root litter', 'gC/m2/wk', &
- c_litter_bg_fr_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC coarse root litter file', &
- bgp_to_bgc_initial_litter_bg_cr_nc_file, &
- 'c_litter_bg_cr_weekly', 'Weekly below ground coarse root litter', 'gC/m2/wk', &
- c_litter_bg_cr_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC leaf N litter file', &
- bgp_to_bgc_initial_litter_ag_lf_n_nc_file, &
- 'c_litter_ag_lf_n_weekly', 'Weekly above ground leaf litter N', 'gN/m2/wk', &
- c_litter_ag_lf_n_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC wood N litter file', &
- bgp_to_bgc_initial_litter_ag_wd_n_nc_file, &
- 'c_litter_ag_wd_n_weekly', 'Weekly above ground wood litter N', 'gN/m2/wk', &
- c_litter_ag_wd_n_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC fine root N litter file', &
- bgp_to_bgc_initial_litter_bg_fr_n_nc_file, &
- 'c_litter_bg_fr_n_weekly', 'Weekly below ground fine litter N', 'gN/m2/wk', &
- c_litter_bg_fr_n_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC coarse root N litter file', &
- bgp_to_bgc_initial_litter_bg_cr_n_nc_file, &
- 'c_litter_bg_cr_n_weekly', 'Weekly below ground coarse root litter N', 'gN/m2/wk', &
- c_litter_bg_cr_n_weekly)
- call write_weekly_pft_file('Writing BGP_to_BGC NPP file', &
- bgp_to_bgc_initial_npp_nc_file, &
- 'c_npp_weekly', 'Weekly npp', 'gC/m2/wk', &
- c_npp_weekly)
- return
- end subroutine bgp_to_bgc_weekly_write
- subroutine write_weekly_pft_file(message, file_name, var_name, var_description, var_units, var_values)
- use netcdf
- use pnetcdf
- use isam_domain, only: numlon, numlat, latitude, longitude
- use isam_comm, only: myid, isam_mpi_comm
- use isam_data_collect
- use mpi, only: MPI_INFO_NULL
- implicit none
- character(*), intent(in) :: message, file_name, var_name, var_description, var_units
- real(r8), intent(inout) :: var_values(myigp_begin:myigp_end, 1:numpft, 1:52)
- ! dimids(:) = lat, lon, numpft, week
- integer :: dimids(4)
- integer :: ierr, i, j
- integer :: nc, varidlat, varidlon, varidv
- integer(kind=MPI_OFFSET_KIND) :: onumlon, onumlat, onumpft, len_desc, len_unit
- if (myid .eq. 0) then
- print *, 'WRITE_BGP_TO_BGC: ', message
- end if
- call nc_check(nfmpi_create(isam_mpi_comm, trim(file_name), nf_clobber, MPI_INFO_NULL, nc))
- onumlon = numlon
- onumlat = numlat
- onumpft = numpft
- call nc_check(nfmpi_def_dim(nc, 'lon', onumlon, dimids(1)))
- call nc_check(nfmpi_def_dim(nc, 'lat', onumlat, dimids(2)))
- ! Define the longitudinal variable
- call nc_check(nfmpi_def_var(nc, 'lon', NF90_DOUBLE, 1, dimids(1), varidlon))
- call nc_check(nfmpi_put_att_text(nc, varidlon, 'long_name', 9, 'longitude'))
- call nc_check(nfmpi_put_att_text(nc, varidlon, 'units', 12, 'degrees_east'))
- ! Define the latitudinal variable
- call nc_check(nfmpi_def_var(nc, 'lat', NF90_DOUBLE, 1, dimids(2), varidlat))
- call nc_check(nfmpi_put_att_text(nc, varidlat, 'long_name', 8, 'latitude'))
- call nc_check(nfmpi_put_att_text(nc, varidlat, 'units', 13, 'degrees_north'))
- ! Set 4D variable
- call nc_check(nfmpi_def_dim(nc, 'pft', onumpft, dimids(3)))
- call nc_check(nfmpi_def_dim(nc, 'weeks', 52, dimids(4)))
- len_desc = len_trim(var_description)
- len_unit = len_trim(var_units)
- call nc_check(nfmpi_def_var(nc, var_name, NF90_DOUBLE, 4, dimids, varidv))
- call nc_check(nfmpi_put_att_text(nc, varidv, 'long_name', len_desc, var_description))
- call nc_check(nfmpi_put_att_text(nc, varidv, 'units', len_unit, var_units))
- call nc_check(nfmpi_enddef(nc))
- if (myid == 0) print *, 'Finished definition mode'
- call nc_check(nfmpi_begin_indep_data(nc))
- if (myid .eq. 0) then
- call nc_check(nfmpi_put_var_double(nc, varidlon, longitude))
- call nc_check(nfmpi_put_var_double(nc, varidlat, latitude))
- end if
- call nc_check(nfmpi_end_indep_data(nc))
- if (myid == 0) print *, 'Wrote lat/lon'
- call write_weekly_pft_variable(nc, varidv, var_values)
- !var_values(:,:,:) = 0._r8
- end subroutine write_weekly_pft_file
- subroutine write_weekly_pft_variable(nfid, varidv, values)
- use pnetcdf
- use mpi, only: MPI_OFFSET_KIND
- use isam_domain, only: myigp_begin, myigp_end, myigp_num, mask
- use isam_comm, only: myid, isam_mpi_comm
- integer, intent(in) :: nfid, varidv ! Parallel-NetCDF file descriptor and variable ID
- real(r8), intent(in) :: values(myigp_begin:myigp_end, 1:numpft, 1:52)
- integer :: i, stat
- integer(MPI_OFFSET_KIND) :: start(4), nvals(4)
- integer, allocatable :: reqs(:), stats(:)
- allocate(reqs(myigp_begin:myigp_end), stats(myigp_begin:myigp_end))
- nvals(1) = 1
- nvals(2) = 1
- nvals(3) = numpft
- nvals(4) = 52
- start(3) = 1
- start(4) = 1
- do i = myigp_begin, myigp_end
- start(1) = mask(i, 2)
- start(2) = mask(i, 3)
- call nc_check(nfmpi_iput_vara_double(nfid, varidv, start, nvals, values(i,:,:), reqs(i)))
- base = base + stride
- if (myid == 0) print *, 'Put data', i, start(1), start(2), myigp_num
- end do
- if (myid == 0) print *, 'Put all data', myigp_num, size(reqs), (myigp_end-myigp_begin+1)
- call nc_check(nfmpi_wait_all(nfid, myigp_num, reqs, stats))
- if (myid == 0) print *, 'Requests completed', myid
- call nc_check(nfmpi_close(nfid))
- if (myid == 0) print *, 'Closed file'
- deallocate(reqs, stats)
- end subroutine write_weekly_pft_variable
- end module bgp_to_bgc_weekly_initial_module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement