Это старая версия документа!


Grt: Normalization.Minerals

Calculation form Excel table. To 3 cations with optional Fe_p3_pfu calculation from charge balance.

Details

Reference
Input SiO2_wtp, TiO2_wtp, Al2O3_wtp, Cr2O3_wtp, Fe2O3_wtp, FeO_wtp, MnO_wtp, MgO_wtp, CaO_wtp
Output Si_pfu, Ti_pfu, Al_pfu, Cr_pfu, Fe_pfu, Fe_p2_wtp, Fe_p3_wtp, Mn_pfu, Mg_pfu, CaO_pfu

Использовать Проверить

  • заголовок
  • краткое описание
  • статья
  • ссылка
  • карточка
  • подробное описание
  • код
  • тест

Source

  1. recalc.grt_nm <- function (wtp_data, ...) {
  2.  
  3. #Names preparation
  4. ox_tnames <- c('SiO2', 'TiO2', 'Al2O3', 'Cr2O3', 'Fe2O3', 'FeO', 'MnO', 'MgO' ,'CaO');
  5. ox_names <- c('SiO2_wtp','TiO2_wtp', 'Al2O3_wtp', 'Cr2O3_wtp', 'Fe2O3_wtp', 'FeO_wtp', 'MnO_wtp', 'MgO_wtp','CaO_wtp');
  6. pfu_names <- c('Si_pfu', 'Ti_pfu', 'Al_pfu', 'Cr_pfu', 'Fe_p3_pfu', 'Fe_p2_pfu', 'Mn_pfu', 'Mg_pfu' ,'Ca_pfu');
  7.  
  8. #Periodic table load
  9. elem <- read.csv("constants_nmperiodic.csv",stringsAsFactors=F, dec = ".");
  10. tmelem <- data.frame(t(elem), stringsAsFactors = F);
  11. names(tmelem) <- elem$oxide;
  12. telem <- selectNames(tmelem,ox_tnames);
  13. names(telem) <- ox_names;
  14.  
  15. #Select columns
  16. wtp_group <- selectNames(wtp_data,ox_names);
  17.  
  18. mole_cations <- rowApply('*', wtp_group, as.numeric(telem['ncations',]));
  19. mole_cations <- rowApply('/', mole_cations, as.numeric(telem['mole_wt',]));
  20.  
  21. mole_oxigen <- rowApply('*', wtp_group, as.numeric(telem['noxygen',]));
  22. mole_oxigen <- rowApply('/', mole_oxigen, as.numeric(telem['mole_wt',]));
  23.  
  24. norm_cations <- mole_cations;
  25.  
  26. for(i in 1:nrow(norm_cations)) {
  27. if(norm_cations[i,]$Fe2O3_wtp>0) {
  28. norm_cations[i,] = norm_cations[i,] * 12/rowSums(mole_oxigen)[i];
  29. } else {
  30. norm_cations[i,] = norm_cations[i,] * 8/rowSums(mole_cations)[i];
  31. }
  32. }
  33. print(norm_cations);
  34. norm_oxygens <- norm_cations;
  35. norm_oxygens <- rowApply('*', norm_oxygens, as.numeric(telem['noxygen',]));
  36. norm_oxygens <- rowApply('/', norm_oxygens, as.numeric(telem['ncations',]));
  37.  
  38. names(norm_cations) <- pfu_names;
  39. charge <- 4*(norm_cations$Si_pfu+norm_cations$Ti_pfu)+
  40. 3*(norm_cations$Al_pfu+norm_cations$Cr_pfu+norm_cations$Fe_p3_pfu)+
  41. 2*(norm_cations$Fe_p2_pfu+norm_cations$Mn_pfu+norm_cations$Mg_pfu+norm_cations$Ca_pfu);
  42. pfu_units <- norm_cations;
  43.  
  44. fecharge <- ifelse(24-charge>0,24-charge,0);
  45. pfu_units$Fe_p3_pfu <- ifelse(pfu_units$Fe_p3_pfu > 0, pfu_units$Fe_p3_pfu, fecharge);
  46. pfu_units$Fe_p2_pfu <- ifelse(norm_cations$Fe_p3_pfu > 0, pfu_units$Fe_p2_pfu, norm_cations$Fe_p2_pfu - pfu_units$Fe_p3_pfu);
  47.  
  48. endcharge <- 4*(pfu_units$Si_pfu+pfu_units$Ti_pfu)+
  49. 3*(pfu_units$Al_pfu+pfu_units$Cr_pfu+pfu_units$Fe_p3_pfu)+
  50. 2*(pfu_units$Fe_p2_pfu+pfu_units$Mn_pfu+pfu_units$Mg_pfu+pfu_units$Ca_pfu);
  51.  
  52. endcharge<- 24-endcharge;
  53.  
  54. rownames <- data.frame(Name = wtp_data$Name);
  55. qcheck <- data.frame(ChargeDisbalance = endcharge);
  56. return (cbind(rownames, pfu_units, qcheck));
  57. }
  58.  
  59. recalc.grt_nm.test <- function () {
  60. test <- data.frame(Name=c("Sp1","Sp2"), SiO2_wtp=c(37.39,37.39), TiO2_wtp=c(0.28, 0.28), Al2O3_wtp=c(10.08,10.08), FeO_wtp=c(19.35, 19.35), Fe2O3_wtp=c(1, 0), MnO_wtp=c(0.14, 0.14), MgO_wtp=c(1.55, 1.55), CaO_wtp=c(29.63, 29.63));
  61. result <- recalc.grt_nm(test);
  62.  
  63. print(result[2,]);
  64.  
  65. expect_equal(object = result[1,]$Fe_p2_pfu, 1.344, tolerance = 0.005);
  66. expect_equal(object = result[2,]$Si_pfu, 2.996, tolerance = 0.005);
  67. }
  • recalc/grt_nm.1488843544.txt.gz
  • Последние изменения: 2018/11/12 15:08
  • (внешнее изменение)