Algorithms to Estimate the Ductile to Brittle Transition Temperature, Upper Shelf Energy, and Their Uncertainties for Steel Using Charpy V-Notch Shear Area and Absorbed Energy Data
Abstract
:1. Introduction
1.1. Importance of Toughness Testing
1.2. Charpy Testing to Assess Steel Ductile and Brittle Behavior
1.3. Methods to Estimate Upper Shelf Absorbed Energy
1.4. Methods to Estimate Ductile to Brittle Transition Temperature
1.5. Methods to Estimate Uncertainty
1.6. Objectives and Research Significance
1.7. Outline
2. Materials and Methods
2.1. Material
2.2. Charpy Bar Machining and Testing
2.3. Algorithm Overview
2.3.1. Shear Appearance Area vs. Test Temperature
2.3.2. Absorbed Energy vs. Test Temperature
2.4. Four-Parameter Algorithm
2.4.1. Calculation of Parameters , , , and and
2.4.2. Calculation of Parameters , , , and and
2.5. Two-Parameter Algorithm
2.6. One-Parameter Algorithm
2.7. Monte-Carlo Simulation for Error and Uncertainty Estimation
3. Results
3.1. Estimates of Shear Appearance Transition Temperature ()
3.2. Estimates of Upper Shelf Energy ()
4. Discussion
4.1. Function Convergence
4.2. Uncertainty Estimation
4.3. Advantages and Disadvantages of Each Algorithm
4.4. Recommendations for Selection of Test Temperatures for Unknown Steel
5. Conclusions
- Four-parameter algorithm
- ○
- Best algorithm for a large data set with low noise that follows the sigmoidal hyperbolic tangent curve quite well.
- ○
- Requires test data from a minimum of four temperatures.
- ○
- Could result in convergence failure if the data set exhibits high noise, does not match the sigmoidal curve shape very well or the initial estimates are poor.
- Two-parameter algorithm
- ○
- Constrains the shear appearance area to physical limits of 0% and 100%.
- ○
- Excellent algorithm to use if the four-parameter algorithm results in convergence failure or high uncertainty.
- ○
- If data are available from only two or three temperatures, this is the best algorithm to use.
- One-parameter algorithm
- ○
- If data are available from only one temperature, this is the only algorithm that will work.
- ○
- Exhibits the least error if the shear appearance area from the test is close to 85%.
Author Contributions
Funding
Institutional Review Board Statement
Informed Consent Statement
Data Availability Statement
Acknowledgments
Conflicts of Interest
Appendix A. R-Markdown Code for the Algorithms Discussed in the Paper (For Reference Only)
--- title: "Hyperbolic Tangent Function" author: "RSI Pipeline Solutions" date: "‘r format(Sys.time(), ’%d %B, %Y’)‘" output: html_document: df_print: paged editor_options: chunk_output_type: inline --- ‘‘‘{r setup, include=FALSE} #Beginning of R-code #setup for rendering knitr::opts_chunk$set( echo = FALSE, #does not echo the codes in the document. message = FALSE, #suppressing library message. warning = FALSE, #suppress warning. dpi = 300 #render images with 300 dots per inch. ) ‘‘‘ ‘‘‘{r libraries and data} #load libraries library(tidyverse) #data analysis and cleaning. library(tidymodels) #machine learning library(minpack.lm) #non-linear least square analysis # Set the theme across all plots, no need to set theme on each plot theme_set(theme_minimal(14)) ‘‘‘ ‘‘‘{r plot theme} # text size for annotations, change this number to adjust consistently across # all plots annosize <- 5 #Consistent theme through all plots mdpi_plot_theme <- theme_bw() + theme( axis.title.x = element_text(size = 14), axis.text.x = element_text(size = 14), axis.title.y = element_text(size = 14), axis.text.y = element_text(size = 14) ) ‘‘‘ ‘‘‘{r data} # create data frame for analysis cvn_data <- data.frame( id = 1, # create id column charpy_thickness_mm = 4.5, #sample thickness in milliliter #temperature in Celsius temp_c = c(-87,-87,-73,-73,-59,-59,-46,-46,-18,-18,0,0), #shear appearance area percent_ sub-size sa_ss = c(1, 1, 23, 25, 74, 45, 83, 88, 99, 99, 99, 99), #absorbed energy sub-size in joule. ae_ss_J = c(7, 4, 8, 14, 31, 18, 41, 41, 45, 46, 46, 49)) # add a tiny bit of noise to avoid the "singular gradient matrix at initial parameter es-timates" error cvn_data <- cvn_data %>% mutate( #add noise to shear area. sa_ss = sa_ss + rnorm(length(cvn_data$id[cvn_data$id == 1]), mean = 0, sd = .02), #add noise to temperature temp_c = temp_c + rnorm(length(cvn_data$id[cvn_data$id == 1]), mean = 0, sd = .02), #add noise to absorbed energy ae_ss_J = ae_ss_J + rnorm(length(cvn_data$id[cvn_data$id == 1]), mean = 0, sd = .02) ) # establish hyperbolic tangent function for repetitive use. func <- function(temp_c, A, B, C, D) { A + B * tanh((temp_c - D) / C) } ‘‘‘ ## Initial values ‘‘‘{r} ##create initial values for regression analysis Ai_sa <- 50 #initial value for A equal 50 for shear area Bi_sa <- 50 #initial value for B equal 50 for shear area Ci <- IQR(cvn_data$temp_c) / 2 #initial value for C equal 1/2 inner quartile range #initial value for D is temperature which shear area close to 50% Di <- (cvn_data$temp_c[which.min(abs(50 - cvn_data$sa_ss))]) # initial value for A is the average of min and max absorbed energy Ai_ae <- (max(cvn_data$ae_ss_J) + min(cvn_data$ae_ss_J)) / 2 #initial value for B is half the difference between min and max absorbed energy. Bi_ae <- (max(cvn_data$ae_ss_J) - min(cvn_data$ae_ss_J)) / 2 ‘‘‘ ## Pre-model conditions and data ‘‘‘{r} ntemp <- nrow(cvn_data) #number of data points nsim <- 1000 #number of iterations sa_mc <- as.list(cvn_data$sa_ss) # list of shear areas for monte carlo analysis ae_mc <- as.list(cvn_data$ae_ss_J) # list of absorbed energy for monte carlo analysis ‘‘‘ ## nlsLM models with MC error ‘‘‘{r four_parameter_sa} #simulate the uncertainty in the solution due to measurement error with a monte #carlo simulation sa_mx_four <- map(sa_mc, ~ rnorm(n = nsim, mean = ., sd = 5)) %>% #simulate 1000 measurements with Standard deviation of 5% error per ASTM E10 tibble() %>% #covert into a data frame rename(cx = ’.’) %>% #renaming the column mutate(id = 1:ntemp) %>% #create the id column unnest(cx) %>% #unnesting the column mutate(cx = case_when(cx < 0 ~ abs(cx), #Simulated values of shear area must be >0 cx > 100 ~ 100, #Simulated values of shear area must be <100 TRUE ~ cx)) %>% #values < 100 and > 0 or unchanged pivot_wider(names_from = id, values_from = cx) %>% #create wide data frame unnest(everything()) %>% #unnest the columns pivot_longer(cols = everything(), values_to = "sa_ss") %>% #create a long data frame mutate(temp_c = rep(cvn_data$temp_c, nsim), #assigned temperature to each value name = rep(1:nsim, each = ntemp)) %>% #create an id column nest(-name) %>% #nest by id #solve the regression for each simulation mutate(mods = map(data, ~ nlsLM( sa_ss ~ func(temp_c, A, B, C, D), data = . , start = list( A = Ai_sa, B = Bi_sa, C = Ci, D = Di ) )), #collecting all the regression solutions and standard errors tidied = map(mods, tidy)) ‘‘‘ ‘‘‘{r four_parameter_sa_param} #shear area 4 parameters solution param_sa_four <- sa_mx_four %>% #calling the data frame of solutions unnest(tidied) %>% #unnesting the solutions select(name,term:std.error) %>% #selecting variables needed group_by(term) %>% #grouping by coefficient summarize(estimate=mean(estimate), #calculate the mean of each coefficient std.error= mean(std.error)) #calculate the mean of each standard error #create a table with solutions+ flextable::flextable(param_sa_four) %>% flextable::colformat_double(digits = 1)%>% flextable::set_caption("Four-Parameter Model Parameters for Shear Area") %>% flextable::autofit() #save parameters for calculations A_sa_four <- param_sa_four$estimate[1] #shear area A parameter B_sa_four <- param_sa_four$estimate[2] #shear area B parameter C_sa_four <- param_sa_four$estimate[3] #shear area C parameter D_sa_four <- param_sa_four$estimate[4] #shear area D parameter #save parameters for errors A_sa_four_error <- param_sa_four$std.error[1] #shear area A error B_sa_four_error <- param_sa_four$std.error[2] #shear area B error C_sa_four_error <- param_sa_four$std.error[3] #shear area C error D_sa_four_error <- param_sa_four$std.error[4] #shear area D error #calculating the transition temperature for the 4 parameters model TT_four <- C_sa_four * atanh((85 - A_sa_four) / B_sa_four) + D_sa_four #95% upper confidences level for transition temperature TT_four_95_high <- (C_sa_four + 1.96 * C_sa_four_error) * atanh((85 - (A_sa_four - 1.96 * A_sa_four_error)) / (B_sa_four + 1.96 * B_sa_four_error)) + (D_sa_four + 1.96 * D_sa_four_error) #95% lower confidences level for transition temperature TT_four_95_low <- (C_sa_four - 1.96 * C_sa_four_error) * atanh((85 - (A_sa_four + 1.96 * A_sa_four_error)) / (B_sa_four - 1.96 * B_sa_four_error)) + (D_sa_four - 1.96 * D_sa_four_error) ‘‘‘ ‘‘‘{r four_parameter_ae} #simulate the uncertainty in the solution due to measurement error with a monte #carlo simulation ae_mx_four <- #simulate 1000 measurements with Standard deviation of SD y = 9.51831e-0.00712x per ASTM E10 map(ae_mc, ~ rnorm(n = nsim, mean = ., sd = 0.0262 * . + 0.6)) %>% tibble() %>% #covert into a data frame rename(cx = ’.’) %>% #renaming the column mutate(id = 1:ntemp) %>% #create the id column unnest(cx) %>% #unnesting the column mutate( #Simulated values of absorbed energy must be >0 cx= case_when( #Simulated values of absorbed energy must be <100 cx<0~abs(cx), TRUE~cx #values < 100 and > 0 or unchanged )) %>% pivot_wider(names_from = id, values_from = cx) %>% #create wide data frame unnest(everything()) %>% #unnest the columns pivot_longer(cols = everything(), values_to = "ae_ss") %>% #create a long data frame mutate(temp_c = rep(cvn_data$temp_c, nsim), #assigned temperature to each value name = rep(1:nsim, each = ntemp)) %>% #create an id column nest(-name) %>% #nest by id #solve the regression for each simulatio mutate(mods = map(data, ~ nlsLM( ae_ss ~ func(temp_c, A, B, C, D), data = . , start = list( A = Ai_ae, B = Bi_ae, C = Ci, D = Di ) )), #collecting all the regression solutions and standard errors tidied = map(mods, tidy)) ‘‘‘ ‘‘‘{r four_parameter_ae_param} #absorbed energy 4 parameters solution param_ae_four <- ae_mx_four %>% #calling the data frame of solutions unnest(tidied) %>% #unnesting the solutions select(name,term:std.error) %>% #selecting variables needed group_by(term) %>% #grouping by coefficient summarize(estimate=mean(estimate), #calculate the mean of each coefficient std.error= mean(std.error)) #calculate the mean of each standard error #create a table with solutions flextable::flextable(param_ae_four) %>% flextable::colformat_double(digits = 1)%>% flextable::set_caption("Four-Parameter Model Parameters for Absorbed Energy") %>% flextable::autofit() #save parameters for calculations A_ae_four <- param_ae_four$estimate[1] #absorbed energy A parameter B_ae_four <- param_ae_four$estimate[2] #absorbed energy B parameter C_ae_four <- param_ae_four$estimate[3] #absorbed energy C parameter D_ae_four <- param_ae_four$estimate[4] #absorbed energy D parameter #save parameters for errors A_ae_four_error <- param_ae_four$std.error[1] #absorbed energy A error B_ae_four_error <- param_ae_four$std.error[2] #absorbed energy B error C_ae_four_error <- param_ae_four$std.error[3] #absorbed energy C error D_ae_four_error <- param_ae_four$std.error[4] #absorbed energy D error #upper shelf energy for the 4 parameters solution us_four <- A_ae_four+B_ae_four ‘‘‘ ‘‘‘{r four_parameter_sa_plot, fig.cap="Four-Parameter Model for Shear Appearance vs. Temperature", fig.asp = 0.75, fig.width = 6.5} # Four-parameter general model shear area plot ---------------------------------------- cvn_data %>% ggplot(aes(temp_c, sa_ss)) + #plot between temperature vs shear area geom_point() + #plot regression solution stat_function(fun = func, args = list(A_sa_four, B_sa_four, C_sa_four, D_sa_four), col=’orangered’) + mdpi_plot_theme + xlim(min(cvn_data$temp_c)-10, max(cvn_data$temp_c)+10)+ labs(x = "Temperature (\u00B0C)", y = "Percent Shear Area (%)") + #confidence interval for transition temperature geom_errorbarh( aes(xmin = TT_four_95_low, xmax = TT_four_95_high, y = 85), height = 5, col = ’blue’, lwd = 0.9 ) + geom_point(aes(x = TT_four, y = 85), col = ’blue’, size = 2) + annotate( "text", label = paste( round(TT_four_95_low, 0), "to", round(TT_four_95_high, 0), "\u00B0C" ), x = (TT_four), y = 60, size = annosize ) + annotate( "text", label = paste("Median:", round(TT_four, 0), "\u00B0C"), x = (TT_four), y = 52.5, size = annosize ) ‘‘‘ ‘‘‘{r four_parameter_ae_plot, fig.cap="Four-Parameter Model Absorbed Energy vs. Temperature", fig.asp = 0.75, fig.width = 6.5} #Four-parameter general model absorbed energy plot cvn_data %>% ggplot(aes(cvn_data$temp_c, ae_ss_J)) + #plot between temperature vs absorbed en-ergy geom_point() + #plot limit for x and y axis ylim(0,us_four+1.96*A_ae_four_error+1.96*B_ae_four_error+5)+ xlim(min(cvn_data$temp_c)-10, max(cvn_data$temp_c)+10)+ stat_function(fun = func, args = list(A_ae_four, B_ae_four, C_ae_four, D_ae_four), col=’orangered’) + mdpi_plot_theme + labs(x ="Temperature (\u00B0C)", y ="Absorbed Energy (J)")+ #confidence interval for transition temperature geom_errorbar( aes(x = max(cvn_data$temp_c)-5, ymin = us_four-1.96*A_ae_four_error-1.96*B_ae_four_error, ymax = us_four+1.96*A_ae_four_error+1.96*B_ae_four_error ), width = 5, col = ’blue’, lwd = 0.9 ) + annotate("text", label=paste(round(us_four,0),"+/-",round(1.96*A_ae_four_error+1.96*B_ae_four_error,0),"J"), x = max(cvn_data$temp_c), y = us_four-1.96*A_ae_four_error-1.96*B_ae_four_error-5, hjust = 1, size = annosize)+ geom_hline(yintercept = us_four, lty = 2, col = ’grey25’, alpha = 0.75) ‘‘‘ ‘‘‘{r two-parameter_sa} # Stimulate the uncertainty in the solution due to measurement error with a #Two-parameter simplified model shear area. sa_mx_two <- #simulate 1000 measurements with Standard deviation of 5% error per ASTM E10 map(sa_mc, ~ rnorm(n = nsim, mean = ., sd = 5)) %>% tibble() %>% #covert into a data frame rename(cx = ’.’) %>% #renaming the column mutate(id = 1:ntemp) %>% #create the id column unnest(cx) %>% #unnesting the column mutate(cx = case_when( #Simulated values of shear area must be >0 cx < 0 ~ abs(cx), #Simulated values of shear area must be <100 cx > 100 ~ 100, TRUE ~ cx #values < 100 and > 0 or unchanged )) %>% pivot_wider(names_from = id, values_from = cx) %>% #create wide data frame unnest(everything()) %>% #unnest the columns pivot_longer(cols = everything(), values_to = "sa_ss") %>% #create a long data frame mutate(temp_c = rep(cvn_data$temp_c, nsim), #assigned temperature to each value name = rep(1:nsim, each = ntemp)) %>% #create an id column nest(-name) %>% #nest by id #solve the regression for each simulation mutate(mods = map(data, ~ nlsLM( sa_ss ~ func(temp_c, 50, 50, C, D), data = . , start = list( C = Ci, D = Di ) )), #collecting all the regression solutions and standard errors tidied = map(mods, tidy)) ‘‘‘ ‘‘‘{r two-parameter_sa_param} #shear area 2 parameters solution #simplified Model param_sa_two <- sa_mx_two %>% #calling the data frame of solutions unnest(tidied) %>% #unnesting the solutions select(name, term:std.error) %>% #selecting variables needed group_by(term) %>% #grouping by coefficient summarize(estimate = mean(estimate), #calculate the mean of each coefficient std.error = mean(std.error)) #calculate the mean of each standard error #create a table with solutions flextable::flextable(param_sa_two) %>% flextable::colformat_double(digits = 1) %>% flextable::set_caption("Two-Parameter Model Parameters for Shear Area") %>% flextable::autofit() #save parameters for calculations C_sa_two <- param_sa_two$estimate[1] #shear area C parameter D_sa_two <- param_sa_two$estimate[2] #shear area D parameter #save parameters for errors C_sa_two_error <- param_sa_two$std.error[1] #shear area C error D_sa_two_error <- param_sa_two$std.error[2] #shear area D error #calculating the transition temperature for the 2 parameters model TT_two <- C_sa_two*atanh((85-50)/50)+D_sa_two #95% upper confidences level for transition temperature TT_two_95_high <- (C_sa_two + 1.96 * C_sa_two_error) * atanh((85 - (50)) / (50)) + (D_sa_two + 1.96 * D_sa_two_error) #95% lower confidences level for transition temperature TT_two_95_low <- (C_sa_two - 1.96 * C_sa_two_error) * atanh((85 - (50)) / (50)) + (D_sa_two - 1.96 * D_sa_two_error) ‘‘‘ ‘‘‘{r two-parameter_ae} # Stimulate the uncertainty in the solution due to measurement error with a #Two-parameter simplified model absorbed energy. ae_mx_one <- #simulate 1000 measurements with Standard deviation of SD y = 9.51831e-0.00712x per ASTM E10 map(ae_mc, ~ rnorm(n = nsim, mean = ., sd = 0.0262 * . + 0.6)) %>% tibble() %>% #covert into a data frame rename(cx = ’.’) %>% #renaming the column mutate(id = 1:ntemp) %>% #create the id column unnest(cx) %>% #unnesting the column mutate( #Simulated values of absorbed energy must be >0 cx= case_when( #Simulated values of absorbed energy must be <100 cx<0~abs(cx), TRUE~cx #values < 100 and > 0 or unchanged )) %>% pivot_wider(names_from = id, values_from = cx) %>% #create wide data frame unnest(everything()) %>% #unnest the columns pivot_longer(cols = everything(), values_to = "ae_ss") %>% #create a long data frame mutate(temp_c = rep(cvn_data$temp_c, nsim), #assigned temperature to each value name = rep(1:nsim, each = ntemp)) %>% #create an id column nest(-name) %>% #nest by id #solve the regression for each simulation mutate(mods = map(data, ~ nlsLM( ae_ss ~ func(temp_c, A, B, C_sa_two, D_sa_two), data = . , start = list( A = Ai_ae, B = Bi_ae ) )), #collecting all the regression solutions and standard errors tidied = map(mods, tidy)) ‘‘‘ ‘‘‘{r two-parameter_ae_param} #absorbed energy 2 parameters solution #simplified Model param_ae_two <- ae_mx_one %>% #calling the data frame of solutions unnest(tidied) %>% #unnesting the solutions select(name,term:std.error) %>% #selecting variables needed group_by(term) %>%#grouping by coefficient summarize(estimate=mean(estimate), #calculate the mean of each coefficient std.error= mean(std.error)) #calculate the mean of each standard error #create a table with solutions flextable::flextable(param_ae_two) %>% flextable::colformat_double(digits = 1)%>% flextable::set_caption("Two-Parameter Model Parameters for Absorbed Energy") %>% flextable::autofit() #save parameters for calculations A_ae_two <- param_ae_two$estimate[1] #absorbed energy A parameter B_ae_two <- param_ae_two$estimate[2] #absorbed energy B parameter #save parameters for errors A_ae_two_error <- param_ae_two$std.error[1] #absorbed energy A error B_ae_two_error <- param_ae_two$std.error[2] #absorbed energy B error #upper shelf energy for the 2 parameters solution us_two <- A_ae_two +B_ae_two ‘‘‘ ‘‘‘{r two-parameter_sa_plot, fig.cap="Two-Parameter Model for Shear Appearance vs. Temperature", fig.asp = 0.75, fig.width = 6.5} # Two-parameter simplified model shear area plot cvn_data %>% ggplot(aes(cvn_data$temp_c, sa_ss)) + #plot between temperature vs shear area geom_point() + stat_function(fun = func, args = list(50, 50, C_sa_two, D_sa_two), col=’orangered’) + mdpi_plot_theme + xlim(min(cvn_data$temp_c)-10, max(cvn_data$temp_c)+10)+ labs(x ="Temperature (\u00B0C)", y ="Percent Shear Area (%)")+ #confidence interval for transition temperature geom_errorbarh( aes(xmin = TT_two_95_low, xmax = TT_two_95_high, y = 85), height = 5, col = ’blue’, lwd = 0.9 ) + geom_point(aes(x = TT_two, y = 85), col = ’blue’, size = 2) + annotate( "text", label = paste( round(TT_two_95_low, 0), "to", round(TT_two_95_high, 0), "\u00B0C" ), x = (TT_two ), y = 60, size = annosize ) + annotate( "text", label = paste("Median:", round(TT_two, 0), "\u00B0C"), x = (TT_two ), y = 52.5, size = annosize ) ‘‘‘ ‘‘‘{r two-parameter_ae_plot, fig.cap="Two-Parameter Model for Absorbed Energy vs. Temperature", fig.asp = 0.75, fig.width = 6.5} #Two-parameters simplified model absorbed energy plot cvn_data %>% ggplot(aes(temp_c, ae_ss_J)) + #plot between temperature vs absorbed energy geom_point() + #plot limit for x and y axis ylim(0,us_two+1.96*A_ae_two_error+1.96*B_ae_two_error+5)+ xlim(min(cvn_data$temp_c)-10, max(cvn_data$temp_c)+10)+ stat_function( fun = func, args = list( A = A_ae_two, B = B_ae_two, C = C_sa_two, D = D_sa_two ), col = ’orangered’ ) + mdpi_plot_theme + theme(panel.grid.minor = element_blank()) + #confidence interval for transition temperature geom_errorbar( aes( x = max(cvn_data$temp_c)-5, ymin = us_two-1.96*A_ae_two_error-1.96*B_ae_two_error, ymax = us_two+1.96*A_ae_two_error+1.96*B_ae_two_error ), width = 5, col = ’blue’, lwd = 0.9) + labs(x = "Temperature (\u00B0C)", y = "Absorbed Energy (J)")+ annotate("text", label=paste(round(us_two,0),"+/-",round(1.96*A_ae_two_error+1.96*B_ae_two_error,0),"J"), x=max(cvn_data$temp_c), y = us_two-1.96*A_ae_two_error-1.96*B_ae_two_error-10, hjust = 1, size = annosize)+ geom_hline(yintercept = us_two, lty = 2, col = ’grey25’, alpha = 0.75) ‘‘‘ ‘‘‘{r one-parameter_sa} #simulate the uncertainty in the solution due to measurement error 1 parameter #simplified shear area simulation. #sigmoidal parameter C_B*2 C_one <- 2*(20.8*log(cvn_data$charpy_thickness_mm,2.7183)-4.8* log(cvn_data$charpy_thickness_mm^2,2.7183)-4.4) sa_mx_one <- #simulate 1000 measurements with Standard deviation of 5% error per ASTM E10 map(sa_mc, ~ rnorm(n = nsim, mean = ., sd = 5)) %>% tibble() %>% #covert into a data frame rename(cx = ’.’) %>% #renaming the column mutate(id = 1:ntemp) %>% #create the id column unnest(cx) %>% #unnesting the column mutate(cx = case_when( #Simulated values of shear area must be >0 cx < 0 ~ abs(cx), #Simulated values of shear area must be <100 cx > 100 ~ 100, #values < 100 and > 0 or unchanged TRUE ~ cx)) %>% pivot_wider(names_from = id, values_from = cx) %>% #create wide data frame unnest(everything()) %>% #unnest the columns pivot_longer(cols = everything(), values_to = "sa_ss") %>% #create a long data frame mutate(temp_c = rep(cvn_data$temp_c, nsim), #assigned temperature to each value name = rep(1:nsim, each = ntemp)) %>% #create an id column nest(-name) %>% #nest by id #solve the regression for each simulation mutate(mods <- map(data, ~ nlsLM( sa_ss ~ func(temp_c, 50, 50, C_one, D), data = . , start = list(D = Di) )), #collecting all the regression solutions and standard errors tidied = map(mods, tidy)) ‘‘‘ ‘‘‘{r one-parameter_sa_param} #shear area one parameter solution param_sa_one <- sa_mx_one %>% #calling the data frame of solutions unnest(tidied) %>% #unnesting the solutions select(name,term:std.error) %>% #selecting variables needed group_by(term) %>% #grouping by coefficient summarize(estimate=mean(estimate), #calculate the mean of each coefficient std.error= mean(std.error)) #calculate the mean of each standard error #create a table with solutions flextable::flextable(param_sa_one) %>% flextable::colformat_double(digits = 1)%>% flextable::set_caption("One-Parameter Model Parameters for Shear Area") %>% flextable::autofit() #save parameter for calculation D_sa_one <- param_sa_one$estimate[1] #shear area D parameter #save parameter for error D_sa_one_error <- param_sa_one$std.error[1] #shear area D error #calculating the transition temperature for 1 parameter model TT_one <- C_one*atanh((85-50)/50)+D_sa_one #95% upper confidences level for transition temperature TT_one_95_high <- (C_one)*atanh((85-(50))/(50))+(D_sa_one+1.96*D_sa_one_error) #95% lower confidences level for transition temperature TT_one_95_low <- (C_one)*atanh((85-(50))/(50))+(D_sa_one-1.96*D_sa_one_error) ‘‘‘ ‘‘‘{r one-parameter_ae} #simulate the uncertainty in the solution due to measurement error 1 parameter #simplified absorbed energy simulation # hyperbolic tangent function for 1 parameter func_one <- function(temp_c, A, C, D) { A + 0.818 * A * tanh((temp_c - D) / C) } ae_mx_one <- #simulate 1000 measurements with Standard deviation of SD y = 9.51831e-0.00712x per ASTM E10 map(ae_mc, ~ rnorm(n = nsim, mean = ., sd = 0.0262 * . + 0.6)) %>% tibble() %>% #covert into a data frame rename(cx = ’.’) %>% #renaming the column mutate(id = 1:ntemp) %>% #create the id column unnest(cx) %>% #unnesting the column mutate( #Simulated values of absorbed energy must be >0 cx= case_when( #Simulated values of absorbed energy must be <100 cx<0~abs(cx), TRUE~cx #values < 100 and > 0 or unchanged )) %>% pivot_wider(names_from = id, values_from = cx) %>% #create wide data frame unnest(everything()) %>% #unnest the columns pivot_longer(cols = everything(), values_to = "ae_ss") %>% #create a long data frame mutate(temp_c = rep(cvn_data$temp_c, nsim), #assigned temperature to each value name = rep(1:nsim, each = ntemp)) %>% #create an id column nest(-name) %>% #nest by id #solve the regression for each simulation mutate(mods = map(data, ~ nlsLM( ae_ss ~ func_one(temp_c, A, C_one, D_sa_one), data = . , start = list( A = Ai_ae ) )), #collecting all the regression solutions and standard errors tidied = map(mods, tidy)) ‘‘‘ ‘‘‘{r one-parameter_ae_param} #absorbed energy 1 parameter solution param_ae_one <- ae_mx_one %>% #calling the data frame of solutions unnest(tidied) %>% #unnesting the solutions select(name,term:std.error) %>% #selecting variables needed group_by(term) %>% #grouping by coefficient summarize(estimate=mean(estimate), #calculate the mean of each coefficient std.error= mean(std.error)) #calculate the mean of each standard error #create a table with solutions flextable::flextable(param_ae_one) %>% flextable::colformat_double(digits = 1)%>% flextable::set_caption("One-Parameter Model Parameters for Absorbed Energy") %>% flextable::autofit() #save parameters for calculations A_ae_one <- param_ae_one$estimate[1] #absorbed energy A parameter #save parameters for errors A_ae_one_error <- param_ae_one$std.error[1] #absorbed energy A error #upper shelf energy for 1 parameter solution us_one <- 1.818 * A_ae_one ‘‘‘ ‘‘‘{r one-parameter_sa_plot, fig.cap="One-Parameter Model for Shear Appearance vs. Temperature", fig.asp = 0.75, fig.width = 6.5} # One-parameter simplified model shear area plot cvn_data %>% ggplot(aes(cvn_data$temp_c, sa_ss)) + #plot between temperature vs shear area geom_point() + #plot regression solution stat_function(fun = func, args = list(50, 50, C_one, D_sa_one), col=’orangered’) + mdpi_plot_theme + xlim(min(cvn_data$temp_c)-10, max(cvn_data$temp_c)+10)+ labs(x ="Temperature (\u00B0C)", y ="Percent Shear Area (%)")+ #confidence interval for transition temperature geom_errorbarh( aes(xmin = TT_one_95_low, xmax = TT_one_95_high, y = 85), height = 5, col = ’blue’, lwd = 0.9 ) + geom_point(aes(x = TT_one, y = 85), col = ’blue’, size = 2) + annotate( "text", label = paste( round(TT_one_95_low, 0), "to", round(TT_one_95_high, 0), "\u00B0C" ), x = (TT_one ), y = 60, size = annosize ) + annotate( "text", label = paste("Median:", round(TT_one, 0), "\u00B0C"), x = (TT_one ), y = 52.5, size = annosize ) ‘‘‘ ‘‘‘{r one-parameter_ae_plot, fig.cap="One-Parameter Model for Absorbed Energy vs. Temperature", fig.asp = 0.75, fig.width = 6.5} # One-parameter simplified model absorbed energy plot cvn_data %>% ggplot(aes(temp_c, ae_ss_J)) + #plot between temperature vs absorbed energy geom_point() + #plot limit for x and y axis ylim(0,us_one+2*1.96*A_ae_one_error+5)+ xlim(min(cvn_data$temp_c)-10, max(cvn_data$temp_c)+10)+ stat_function( fun = func, args = list( A = A_ae_one, B = 0.818*A_ae_one, C = C_one, D = D_sa_one ), col = ’orangered’ ) + mdpi_plot_theme + theme(panel.grid.minor = element_blank()) + #confidence interval for transition temperature geom_errorbar(aes( x = max(cvn_data$temp_c)-5, ymin = us_one-1.96*(1.818*A_ae_one_error), ymax = us_one+1.96*(1.818*A_ae_one_error) ), width = 5, col = ’blue’, lwd = 0.9) + labs(x = "Temperature (\u00B0C)", y = "Absorbed Energy (J)")+ annotate("text", label=paste(round(us_one,0),"+/-",round(1.96*(1.818*A_ae_one_error),0),"J"), x = max(cvn_data$temp_c), y = us_one-1.96*(1.818*A_ae_one_error)-5, hjust = 1, size = annosize)+ geom_hline(yintercept = us_one, lty = 2, col = ’grey25’, alpha = 0.75) ‘‘‘ |
References
- Toth, L.; Rossmanith, H.; Siewert, T. Historical Background and Development of the Charpy Test. In From Charpy to Present Impact Testing; Elsevier: Amsterdam, The Netherlands, 2002; pp. 3–19. [Google Scholar]
- Makhutov, N.; Morozov, E.; Matvienko, Y. Some Historical Aspects and the Development of the Charpy Test in Russia. In From Charpy to Present Impact Testing; Elsevier: Amsterdam, The Netherlands, 2002; pp. 197–204. [Google Scholar]
- Manahan, M.P. Determination of Charpy Transition Temperature of Ferritic Steels Using Miniaturized Specimens. J. Mater. Sci. 1990, 25, 3429–3438. [Google Scholar] [CrossRef]
- Zappas, K. Constance Tipper Cracks the Case of the Liberty Ships. JOM 2015, 67, 2774–2776. [Google Scholar] [CrossRef]
- List of Bridge Failures. Available online: https://en.wikipedia.org/wiki/List_of_bridge_failures (accessed on 28 July 2022).
- First Report of the Gas Cylinders Research Committee; Department of Scientific and Industrial Research, His Majesty’s Stationery Office: London, UK, 1921.
- Franqois, D.; Pineau, A.; Wistance, W.; Pumphrey, P.H.; Howarth, D.J. Materials Qualification for the Shipbuilding Industry. In From Charpy to Present Impact Testing; Elsevier: Amsterdam, The Netherlands, 2002; pp. 393–400. [Google Scholar]
- Wang, Y.; Zhu, L.; Zhang, Q.; Zhang, C.; Wang, S. Effect of Mg Treatment on Refining the Microstructure and Improving the Toughness of the Heat-Affected Zone in Shipbuilding Steel. Metals 2018, 8, 616. [Google Scholar] [CrossRef]
- Franqois, D.; Pineau, A.; Morrison, J.; Wu, X. The Toughness Transition Curve of a Ship Steel. In From Charpy to Present Impact Testing; Elsevier: Amsterdam, The Netherlands, 2002; pp. 385–392. [Google Scholar]
- Tanguy, B.; Besson, J.; Piques, R.; Pineau, A. Ductile to Brittle Transition of an A508 Steel Characterized by Charpy Impact Test Part I: Experimental Results. Eng. Fract. Mech. 2005, 72, 49–72. [Google Scholar] [CrossRef]
- Vértesy, G.; Gasparics, A.; Uytdenhouwen, I.; Szenthe, I.; Gillemot, F.; Chaouadi, R. Nondestructive Investigation of Neutron Irradiation Generated Structural Changes of Reactor Steel Material by Magnetic Hysteresis Method. Metals 2020, 10, 642. [Google Scholar] [CrossRef]
- Khan, W.; Tufail, M.; Chandio, A.D. Characterization of Microstructure, Phase Composition, and Mechanical Behavior of Ballistic Steels. Materials 2022, 15, 2204. [Google Scholar] [CrossRef] [PubMed]
- Zhu, J.; Tan, Z.; Tian, Y.; Gao, B.; Zhang, M.; Wang, J.; Weng, Y. Effect of Tempering Temperature on Microstructure and Mechanical Properties of Bainitic Railway Wheel Steel with Thermal Damage Resistance by Alloy Design. Metals 2020, 10, 1221. [Google Scholar] [CrossRef]
- Goo, B.C. Effect of Post-Weld Heat Treatment on the Fatigue Behavior of Medium-Strength Carbon Steel Weldments. Metals 2021, 11, 1700. [Google Scholar] [CrossRef]
- Ju, H.; Lee, S.J.; Choi, S.M.; Kim, J.R.; Lee, D. Applicability of Hybrid Built-up Wide Flange Steel Beams. Metals 2020, 10, 567. [Google Scholar] [CrossRef]
- Liu, X.; Cai, Z.; Yang, S.; Feng, K.; Li, Z. Characterization on the Microstructure Evolution and Toughness of TIG Weld Metal of 25Cr2Ni2MoV Steel after Post Weld Heat Treatment. Metals 2018, 8, 160. [Google Scholar] [CrossRef]
- Franqois, D.; Pineau, A.; Andrews, R.M.; Pistone, V. European Pipeline Research Group Studies on Ductile Crack Propagation in Gas Transmission Pipelines. In From Charpy to Present Impact Testing; Elsevier: Amsterdam, The Netherlands, 2002; pp. 377–384. [Google Scholar]
- Kantor, M.M.; Vorkachev, K.G.; Bozhenov, V.A.; Solntsev, K.A. The Role of Splitting Phenomenon under Fracture of Low-Carbon Microalloyed X80 Pipeline Steels during Multiple Charpy Impact Tests. Appl. Mech. 2022, 3, 740–756. [Google Scholar] [CrossRef]
- Dong, Y.; Liu, D.; Hong, L.; Liu, J.; Zuo, X. Correlation between Microstructure and Mechanical Properties of Welded Joint of X70 Submarine Pipeline Steel with Heavy Wall Thickness. Metals 2022, 12, 716. [Google Scholar] [CrossRef]
- Park, M.; Kang, M.S.; Park, G.W.; Choi, E.Y.; Kim, H.C.; Moon, H.S.; Jeon, J.B.; Kim, H.; Kwon, S.H.; Kim, B.J. The Effects of Recrystallization on Strength and Impact Toughness of Cold-Worked High-Mn Austenitic Steels. Metals 2019, 9, 948. [Google Scholar] [CrossRef]
- Nguyen, L.T.H.; Hwang, J.S.; Kim, M.S.; Kim, J.H.; Kim, S.K.; Lee, J.M. Charpy Impact Properties of Hydrogen-Exposed 316l Stainless Steel at Ambient and Cryogenic Temperatures. Metals 2019, 9, 625. [Google Scholar] [CrossRef]
- Hermanová, Š.; Kuboň, Z.; Čížek, P.; Kosňovská, J.; Rožnovská, G.; Dorazil, O.; Cieslarová, M. Study of Material Properties and Creep Behavior of a Large Block of AISI 316L Steel Produced by SLM Technology. Metals 2022, 12, 1283. [Google Scholar] [CrossRef]
- Razzaq, A.M.; Majid, D.L.; Ishak, M.R.; Basheer, U.M. Effect of Fly Ash Addition on the Physical and Mechanical Properties of AA6063 Alloy Reinforcement. Metals 2017, 7, 477. [Google Scholar] [CrossRef]
- Alshahrani, H.; Sebaey, T.A. Effect of Embedded Thin-Plies on the Charpy Impact Properties of CFRP Composites. Polymers 2022, 14, 1929. [Google Scholar] [CrossRef] [PubMed]
- ASTM E23; Standard Test Methods for Notched Bar Impact Testing of Metallic Materials. ASTM International: West Conshohocken, PA, USA, 2016.
- Oldfield, W. Curve Fitting Impact Test Data: A Statistical Procedure. ASTM Stand. News 1975, 3, 24–29. [Google Scholar]
- Rosenfeld, M.J. A Simple Procedure for Synthesizing Charpy Impact Energy Transition Curves from Limited Test Data (IPC1996-1826). In Proceedings of the ASME International Pipeline Conference, Calgary, AB, Canada, 9–13 June 1996; pp. 215–221. [Google Scholar]
- Pisarski, H.; Hayes, B.; Olbricht, J.; Lichter, P.; Wiesner, C. Validation of Idealised Charpy Impact Energy Transition Curve Shape. In From Charpy to Present Impact Testing; Elsevier: Amsterdam, The Netherlands, 2002; pp. 333–340. [Google Scholar]
- Marini, B. Empirical Estimation of Uncertainties of Charpy Impact Testing Transition Temperatures for an RPV Steel. EPJ Nucl. Sci. Technol. 2020, 6, 57. [Google Scholar] [CrossRef]
- Orynyak, I.; Zarazovskii, M.; Bogdan, A. Determination of the Transition Temperature Scatter Using the Charpy Data Scatter. In Proceedings of the Pressure Vessels and Piping Division PVP, Paris, France, 14–18 July 2013; American Society of Mechanical Engineers: New York, NY, USA, 2013. [Google Scholar]
- Rosenfeld, M. Procedure Improves Line Pipe Charpy Test Interpretation. Oil Gas J. 1997, 95, 40–44. [Google Scholar]
- API 579-1/ASME FFS-1; Fitness-For-Service. American Petroleum Institute: Washington, DC, USA, 2016.
- Barsom, J.M.; Rolfe, S.T. Correlations Between KIC and Charpy V-Notch Test Results in the Transition-Temperature Range. In Impact Testing of Metals; ASTM International: West Conshohocken, PA, USA, 1970; pp. 281–302. [Google Scholar]
- Lucon, E.; McCowan, C.N.; Santoyo, R.L. Impact Characterization of Line Pipe Steels by Means of Standard, Sub-Size and Miniaturized Charpy Specimens; National Institute of Standards and Technology: Gaithersburg, MD, USA, 2015. [Google Scholar]
- Anderson, J.; Switzner, N.; Martin, P.; Rosenfeld, M.; Ali, L.; Patrick, B.; Veloo, P. Automated Methods to Estimate Transition Temperature, Upper Shelf Energy, and Uncertainty from Charpy V-Notch Data. In Proceedings of the Pipeline Pigging and Integrity Management Conference, Houston, TX, USA, 7–11 February 2023; Clarion: Houston, TX, USA, 2023. [Google Scholar]
- Levenberg, K. A Method for the Solution of Certain Non-Linear Problems in Least Squares. Q. Appl. Math. 1944, 2, 164–168. [Google Scholar] [CrossRef]
- Marquardt, D. An Algorithm for Least-Squares Estimation of Nonlinear Parameters. J. Soc. Ind. Appl. Math. 1963, 11, 431–441. [Google Scholar] [CrossRef]
- Elzhov, T.; Mullen, K.; Spiess, A.; Bolker, B. R Interface to the Levenberg-Marquardt Nonlinear Least-Squares Algorithm Found in MINPACK, Plus Support for Bounds. 2022. Available online: https://rdrr.io/cran/minpack.lm/ (accessed on 23 April 2023).
- Philipps, V.; Hejblum, B.; Prague, M.; Commenges, D.; Proust-Lima, C. Robust and Efficient Optimization Using a Marquardt-Levenberg Algorithm with R Package MarqLevAlg. arXiv 2021, arXiv:2009.03840. [Google Scholar] [CrossRef]
- Reinbolt, J.A.; Harris, W.F., Jr. Effect of Alloying Elements on Notch Toughness of Pearlitic Steels. Trans. ASM 1951, 43, 1175–1214. [Google Scholar]
Aluminum | Carbon | Chromium | Copper |
<0.005 | 0.20 | 0.04 | 0.06 |
Manganese | Molybdenum | Nickel | Niobium |
1.03 | 0.01 | 0.06 | 0.04 |
Phosphorus | Silicon | Sulfur | Titanium/Vanadium |
0.01 | 0.02 | 0.021 | <0.005 |
Test Temperature (°C) | Shear Appearance Area (%) | Absorbed Energy (J) |
---|---|---|
−87 | 1 | 7 |
−87 | 1 | 4 |
−73 | 23 | 8 |
−73 | 25 | 14 |
−59 | 74 | 31 |
−59 | 45 | 18 |
−46 | 83 | 41 |
−46 | 88 | 41 |
−18 | 99 | 45 |
−18 | 99 | 46 |
0 | 99 | 46 |
0 | 99 | 49 |
Sigmoidal Parameters | Charpy Specimen Thickness | ||||
---|---|---|---|---|---|
1/4-Size 2.5 mm | 1/3-Size 3.3 mm | 1/2-Size 5.0 mm | 2/3-Size 6.7 mm | Full-Size 10 mm | |
(where is the center of the transition region.) | 12 °C (22 °F) | 16 °C (28 °F) | 20 °C (36 °F) | 23 °C (41 °F) | 28 °C (50 °F) |
(where is the half-width of the transition region.) | 11 °C (19 °F) | 13 °C (24 °F) | 17 °C (30 °F) | 18 °C (32 °F) | 18 °C (33 °F) |
Algorithm | Parameters | |||
---|---|---|---|---|
(%) | (%) | (°C) | (°C) | |
Four-parameter | 46.4 | 51.5 | 18.9 | −64.5 |
Two-parameter | Set to 50 | Set to 50 | 18.22.9 | −62.6 1.5 |
One-Parameter | Set to 50 | Set to 50 | Calculated (29.7) | −62.1 2.8 |
Algorithm | Parameters | |||
---|---|---|---|---|
(J) | (J) | (°C) | (°C) | |
Four-parameter | 25.61.9 | 21.1 | 15.6 | −58.92.7 |
Two-parameter | 23.41.2 | 22.61.6 | Set to | Set to |
One-Parameter | 25.61.3 | Set to 0.818 | Set to | Set to |
Disclaimer/Publisher’s Note: The statements, opinions and data contained in all publications are solely those of the individual author(s) and contributor(s) and not of MDPI and/or the editor(s). MDPI and/or the editor(s) disclaim responsibility for any injury to people or property resulting from any ideas, methods, instructions or products referred to in the content. |
© 2023 by the authors. Licensee MDPI, Basel, Switzerland. This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution (CC BY) license (https://creativecommons.org/licenses/by/4.0/).
Share and Cite
Switzner, N.T.; Anderson, J.; Ahmed, L.A.; Rosenfeld, M.; Veloo, P. Algorithms to Estimate the Ductile to Brittle Transition Temperature, Upper Shelf Energy, and Their Uncertainties for Steel Using Charpy V-Notch Shear Area and Absorbed Energy Data. Metals 2023, 13, 877. https://doi.org/10.3390/met13050877
Switzner NT, Anderson J, Ahmed LA, Rosenfeld M, Veloo P. Algorithms to Estimate the Ductile to Brittle Transition Temperature, Upper Shelf Energy, and Their Uncertainties for Steel Using Charpy V-Notch Shear Area and Absorbed Energy Data. Metals. 2023; 13(5):877. https://doi.org/10.3390/met13050877
Chicago/Turabian StyleSwitzner, Nathaniel T., Joel Anderson, Lanya Ali Ahmed, Michael Rosenfeld, and Peter Veloo. 2023. "Algorithms to Estimate the Ductile to Brittle Transition Temperature, Upper Shelf Energy, and Their Uncertainties for Steel Using Charpy V-Notch Shear Area and Absorbed Energy Data" Metals 13, no. 5: 877. https://doi.org/10.3390/met13050877
APA StyleSwitzner, N. T., Anderson, J., Ahmed, L. A., Rosenfeld, M., & Veloo, P. (2023). Algorithms to Estimate the Ductile to Brittle Transition Temperature, Upper Shelf Energy, and Their Uncertainties for Steel Using Charpy V-Notch Shear Area and Absorbed Energy Data. Metals, 13(5), 877. https://doi.org/10.3390/met13050877