What is up with Carbon Flux?

The data for this project includes Carbon stock, flux and other estimates, with data collected between 1979 and 2014, then again in 2015 as a ‘control’ year for future predictions based on a model. The Community Land Model was used to look at different scenarios. In particular this project is interested in the collected real data between 1979 and 2014, and the business as usual (BAU) scenario, in which predictions of tree stand ages and coverage are predicted based on 2015 events. These models aim to predict carbon storage and flux based on climate change and economic harvest rates.

The Data Maps

The initial data collection, differences between 1979 and 2014. It only makes sense that we must have measurements of carbon storage for some period of time before we can make accurate assumptions. For the 35 years of collection, we will focus on the first and last points in time, either end of the spectrum, so we can look at the big differences over this interval of time, from which we can start to understand a general trend. This data includes eleven unique variables that we could look at, however we are particularly interested in :

NPP - Net Primary Production

AGC - Above Ground Live Tree Carbon

BAF - Burned Area Fraction

CL - Carbon Loss to Fire

What do these Variables Mean?

Net primary production will tell us about the ecosystem health. Primary production refers to the production of organic matter by primary consumers such as plants, tree’s and more. A higher value NPP means higher rates of photosynthesis.

Aboveground live tree carbon shows us how much biomass exists within the ecosystem, so it is a good measure for Carbon Storage. This is important because our forests act as carbon sinks, which help keep our ecosystem in balance.

Burned Area Fraction is a measure of how much of each cell within the map has been burned. This is based off the resolution of the maps. The Resolution of these maps are 4km x 4km , so each measure is a fraction of a 4km x 4km square area on the ground.

Carbon loss to fire will give us an idea of how much carbon our ecosystem loses carbon to fires.

Since around 2020, the threat of wildfires has drastically increased, with a record breaking fire year, and that record only keeps increasing as our climate changes. Our forests are our air filter so it’s important to take care of it and promote growth and conservation. However we often do things to hurt the ecosystem, such as deforestation , poison it with agricultural chemicals, mining etc. Wildfires, as useful as they can be, can often be devastating. Our hand in fire activity also plays a huge role, as naturally occurring fires make up so little of the wildfires that actually get started, an article in the Smithsonian Magazine says about 84% of wildfires are started by people. Wildfires are a huge factor of forest health, in turn global health. The interaction between wildfires and carbon stocks are incredibly important, so let’s have a look.

1979 to 2014 Data Collected

Read in packages and File first

# Suppress warnings while loading packages
suppressWarnings({
  # Load packages
  library(maps)
  library(sf)
  library(terra)
  library(ggplot2)
  library(RColorBrewer)
  library(patchwork)
  library(ggspatial)
  library(tidyterra)
  library(rmarkdown)
})
## Linking to GEOS 3.11.2, GDAL 3.7.2, PROJ 9.3.0; sf_use_s2() is TRUE
## terra 1.7.71
## 
## Attaching package: 'patchwork'
## The following object is masked from 'package:terra':
## 
##     area
## 
## Attaching package: 'tidyterra'
## The following object is masked from 'package:stats':
## 
##     filter
# Read data Carbon fluxes 1979 to 2014
CarbonFlux_path <- "C:/Users/jettr/Dropbox (University of Oregon)/23-24/Winter/Geog 490 Mapping with R/Final Proj/data Directory/"
CarbonFlux_name <- "IPSL_1979_2014_merge.nc"
CFlux_file <- paste(CarbonFlux_path, CarbonFlux_name, sep = "")
CFlux <- rast(CFlux_file)

variable_names <- varnames(CFlux)
print(variable_names)

names = names(CFlux)
print(names)

Net Primary Production

# Extract and Plot NPP data for 1979
NPP_1979 <- subset(CFlux, 1, names = "NPP")
NPP_df_1979 <- as.data.frame(NPP_1979)
names(NPP_df_1979) <- "NPP"

# Calculate min and max values
NPP_min_value_1979 <- min(values(NPP_1979), na.rm = TRUE)
NPP_max_value_1979 <- max(values(NPP_1979), na.rm = TRUE)
NPP_avg_1979 = mean(values(NPP_1979), na.rm =TRUE)

# Plot NPP_1979 data with ggplot2
NPP_plot_1979 <- ggplot() +
  geom_spatraster(data = NPP_1979, aes(fill = NPP_1)) +
  scale_fill_gradientn(colours = rev(brewer.pal(9, "Greens")), name = "g/m*m*s", limits = c(NPP_min_value_1979,NPP_max_value_1979), na.value = "transparent") +  # Customize color scale
  labs(x = "Longitude", y = "Latitude") +  # Customize axis labels
  ggtitle("Net Primary Production 1979") + # Add title
  theme(panel.background = element_rect(fill = "lightgrey")) + 
  theme_light()  # Adjust theme if needed

# Extract and Plot NPP data for 2014
NPP_2014 <- subset(CFlux, 36, names = "NPP")
NPP_df_2014 <- as.data.frame(NPP_2014)
names(NPP_df_2014) <- "NPP"

# Calculate min and max values
NPP_min_value_2014 <- min(values(NPP_2014), na.rm = TRUE)
NPP_max_value_2014 <- max(values(NPP_2014), na.rm = TRUE)
NPP_avg_2014 = mean(values(NPP_2014), na.rm = TRUE)

# PLot NPP_2014 data with ggplot2
NPP_plot_2014 <- ggplot() +
  geom_spatraster(data = NPP_2014, aes(fill = NPP_36)) +
  scale_fill_gradientn(colours = rev(brewer.pal(9, "Greens")), name = "g/m*m*s", limits = c(NPP_min_value_2014,NPP_max_value_2014), na.value = "transparent") +  # Customize color scale
  labs(x = "Longitude", y = "Latitude") +  # Customize axis labels
  ggtitle("Net Primary Production 2014") + # Add title
  theme(panel.background = element_rect(fill = "lightgrey")) + 
  theme_light()  # Adjust theme if needed

# Combine plots into subplots
NPP_subplots <- NPP_plot_1979 + NPP_plot_2014

print(NPP_max_value_1979)
## [1] 4.207236e-05
print(NPP_max_value_2014)
## [1] 3.847509e-05
print(NPP_avg_1979)
## [1] 1.516792e-05
print(NPP_avg_2014)
## [1] 1.098262e-05
# Print the subplots
print(NPP_subplots)

Above Ground Live tree Carbon

## [1] 21955.75
## [1] 21163.31
## [1] 4722.245
## [1] 5696.683

Burned Area Fraction

## [1] 1.782241e-09
## [1] 1.134425e-08
## [1] 7.237307e-12
## [1] 1.418723e-10

Carbon Loss to fire

## [1] 7.863512e-06
## [1] 6.067921e-05
## [1] 1.620837e-08
## [1] 5.177122e-07

1979 to 2014 Takeaways

NPP - average slight increase in NPP to 2014 , maximum decreases

AGC - On average higher in PNW , little change around Colorado Arizona, slightly higher, not incredibly noticeable. MORE SPOTS, DARK , Possibly increase in logging and deforestation.

Burned Area Fraction - On Average , there is less burned area, however there are some spots near Idaho that are lighter. This Variable is a bit less indicative, because burned areas can linger, trees can be replanted etc. But also the changes in this variable are so small, likely due to resolution. A 4km x 4km area is fairly large.

Carbon Loss to Fire - In the west, there is a trend toward more carbon lost, this becomes more prominent in the east. We can also see that in 2014 there is less coverage, possibly

The Forecast

The Model uses data, laws and other regulations from 2015 to project into the year 2099 , a business as usual prediction. The simulation uses the Community Land Model (v4.5) with current day forest stand ages, harvest rates and a climate prediction model.

Net Primary Production

# Net Primary Production

# Extract and Plot NPP data for 2015
NPP_2015 <- subset(CFlux, 1, names = "NPP")
NPP_df_2015 <- as.data.frame(NPP_2015)
names(NPP_df_2015) <- "NPP"

# Calculate min and max values
NPP_min_value_2015 <- min(values(NPP_2015), na.rm = TRUE)
NPP_max_value_2015 <- max(values(NPP_2015), na.rm = TRUE)
NPP_avg_value_2015 = mean(values(NPP_2015), na.rm = TRUE)

# Plot NPP_1979 data with ggplot2
NPP_plot_2015 <- ggplot() +
  geom_spatraster(data = NPP_2015, aes(fill = NPP_1)) +
  scale_fill_gradientn(colours = rev(brewer.pal(9, "Greens")), name = "g/m*m*s", limits = c(NPP_min_value_2015,NPP_max_value_2015), na.value = "transparent") +  # Customize color scale
  labs(x = "Longitude", y = "Latitude") +  # Customize axis labels
  ggtitle("Net Primary Production 2015") + # Add title
  theme(panel.background = element_rect(fill = "lightgrey")) + 
  theme_light()  # Adjust theme if needed

# Extract and Plot NPP data for 2014
NPP_2065 <- subset(CFlux, 65, names = "NPP")
NPP_df_2065 <- as.data.frame(NPP_2065)
names(NPP_df_2065) <- "NPP"

# Calculate min and max values
NPP_min_value_2065 <- min(values(NPP_2065), na.rm = TRUE)
NPP_max_value_2065 <- max(values(NPP_2065), na.rm = TRUE)
NPP_avg_value_2065 = mean(values(NPP_2065), na.rm = TRUE)


# PLot NPP_2014 data with ggplot2
NPP_plot_2065 <- ggplot() +
  geom_spatraster(data = NPP_2065, aes(fill = NPP_65)) +
  scale_fill_gradientn(colours = rev(brewer.pal(9, "Greens")), name = "g/m*m*s", limits = c(NPP_min_value_2065,NPP_max_value_2065), na.value = "transparent") +  # Customize color scale
  labs(x = "Longitude", y = "Latitude") +  # Customize axis labels
  ggtitle("Net Primary Production 2065") + # Add title
  theme(panel.background = element_rect(fill = "lightgrey")) + 
  theme_light()  # Adjust theme if needed

# Combine plots into subplots
NPP_subplots <- NPP_plot_2015 + NPP_plot_2065

# Print the subplots
print(NPP_subplots)
print(NPP_max_value_2015)
## [1] 3.656706e-05
print(NPP_max_value_2065)
## [1] 4.909489e-05
print(NPP_avg_value_2015)
## [1] 1.006336e-05
print(NPP_avg_value_2065)
## [1] 1.557787e-05

Above ground Live Tree Carbon

## [1] 21145.4
## [1] 24255.52
## [1] 5685.719
## [1] 6551.513

Burned Area Fraction

## [1] 1.676058e-08
## [1] 5.267383e-09
## [1] 1.775562e-10
## [1] 1.192131e-10

Carbon Loss

## [1] 6.067921e-05
## [1] 2.227994e-05
## [1] 6.589789e-07
## [1] 6.589789e-07

Forecast takeaways

NPP - PNW and West fairly similar, slightly darker in Utah/Montana area. E Nevada, Utah , Arizona Area sees darkening , less production of carbon in 2065. Max values of NPP increase in 2065 , so colors that are the same between graphs represent greater values in 2065.

AGC - Max Values greater in 2065 , most of the map is similar, so on average , 2065 has greater values.

BAF - Mostly dark because this is related to wildfire burned areas. 2065 sees more light spots, meaning more fires in these locations. We can see that 2065 has more fires, especially in Idaho.

CL - Carbon loss is very closely related to BAF , particularly spatially. Carbon Loss Maximum is larger for 2015 , however because we saw more burned locations in the previous graph, there are more locations in which noticeable carbon loss occurs in 2065.

Conclusions

Over the span of 35 years from 1979 to 2014, primary production increases, so the forest is photosynthesizing at higher rates, so forest biomass is increased and producing energy faster than it is respiring. We can also see in the Above ground tree carbon, that there are spots that are dark, this could be due to logging or deforestation, since dark spots represent a lack of a tree stand, however some of this could also be due to fires. Carbon loss and burned area fraction are very similar, however just because an area is burned doesn’t mean all carbon is lost. Generally we can see that in 2014, less area has been burned, yet more area has experienced larger carbon loss. Most of the carbon loss is hardly noticeable, but present in small splotches more east.

From 2015 , through 2065 , a 50 year period, using a simulated model, we can see our carbon storage and flux forecast for the western US. In primary production, the PNW seems to have similar measures for primary production, however there is definitely a decrease in biomass in the more eastern part of the plot, in the Colorado, SE Nevada region. Above ground tree carbon is nearly similar, however the scale is different, so there is a general increase in Tree carbon storage in 2065. In 2065 , there is noticeably more area that is lighter, these are small splotches, however there are some larger areas in the Sierras and near Colorado that are brighter. The scale however is far different, as these lighter areas in 2065 show a smaller fraction of burned area. A similar trend can be found in carbon loss.

The model is showing some conflicting ideas. There seems to be a general reduction in biomass in the long term, however there is also more tree carbon. The carbon loss to fire and Burned area may be explained by increasing fire incidents, with less large fires, which would show as smaller BAF and more light area in the CL to fire.

Discussion and Restrictions

The nature of the model is simply a thought experiment, how might carbon flux and storage look if we continued 2015 harvest rates, climate , economy etc. How might these measures change over time and look in the future? This data proved to be difficult to work with in a couple ways, the nature of the data files proved difficult to pull out the individual variables such as specific years of a variable. Once the plotting was done, it became increasingly difficult to figure out how to represent it well. The scales change from year to year, with data at increasingly smaller magnitudes and differences, with zeros and nan values. Ways to improve would be to plot this data across a map of the united states, to get a better idea of the spatial relations. Figuring out a better scale for the color map, this became difficult as I wanted to plot the data on a logarithmic scale, yet logarithmic transformations wouldn’t work with the zero values. It would be easier to see trends if plotted against more years, and finding some way to find correlation coefficients between different variable may also prove useful.

Sources

NACP: Forest Carbon Stocks, fluxes and Productivity Estimates, Western USA, 1979-2099. ORNL DAAC. (n.d.). https://daac.ornl.gov/NACP/guides/NACP_Forest_Conservation.html

Magazine, S. (2017, February 28). Study shows 84% of wildfires caused by humans. Smithsonian.com. https://www.smithsonianmag.com/smart-news/study-shows-84-wildfires-caused-humans-180962315/

Biology Online. (n.d.). Net Primary Productivity. Retrieved from https://www.biologyonline.com/dictionary/net-primary-productivity