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


Базовые алгоритмы программы TPF

  1. tpf.elements <- read.csv("constants_elements_tpf.csv",stringsAsFactors=F)
  2.  
  3. tpf.oxides_ord <- c('SiO2_wtp', 'Al2O3_wtp', 'TiO2_wtp', 'Cr2O3_wtp', 'Fe2O3_wtp',
  4. 'FeO_wtp', 'MnO_wtp', 'MgO_wtp', 'CaO_wtp', 'Na2O_wtp', 'K2O_wtp',
  5. 'BaO_wtp', 'NiO_wtp', 'ZnO_wtp', 'BeO_wtp', 'P2O5_wtp', 'V2O5_wtp',
  6. 'CoO_wtp', 'GeO2_wtp', 'ZrO2_wtp', 'Cs2O_wtp', 'PbO_wtp', 'SO3_wtp',
  7. 'CO2_wtp', 'F_wtp', 'Cl_wtp');
  8.  
  9. tpf.oxides_elements_ord <- c('Si', 'Al', 'Ti', 'Cr', 'Fe3', 'Fe2', 'Mn', 'Mg',
  10. 'Ca', 'Na', 'K', 'Ba', 'Ni', 'Zn', 'Be', 'P', 'V',
  11. 'Co', 'Ge', 'Zr', 'Cs', 'Pb', 'S', 'C', 'F', 'Cl');
  12.  
  13. tpf.elements_ord <- c('Si', 'Al', 'Ti', 'Cr', 'Fe3', 'Fe2', 'Mn', 'Mg', 'Ca',
  14. 'Na', 'K', 'Ba', 'Ni', 'Zn', 'Be', 'P', 'V', 'Co', 'Ge',
  15. 'Zr', 'Cs', 'Pb', 'S', 'C', 'F', 'Cl', 'Al4', 'Al6', 'Fe');
  16.  
  17. tpf.elements_rename <- c('Si_pfu', 'Al_pfu', 'Ti_pfu', 'Cr_pfu', 'Fe_p3_pfu', 'Fe_p2_pfu',
  18. 'Mn_pfu', 'Mg_pfu', 'Ca_pfu', 'Na_pfu', 'K_pfu', 'Ba_pfu', 'Ni_pfu',
  19. 'Zn_pfu', 'Be_pfu', 'P_pfu', 'V_pfu', 'Co_pfu', 'Ge_pfu', 'Zr_pfu',
  20. 'Cs_pfu', 'Pb_pfu', 'S_pfu', 'C_pfu', 'F_pfu', 'Cl_pfu',
  21. 'Al_c4_pfu', 'Al_c6_pfu', 'Fe_pfu');
  22.  
  23.  
  24. tpf.rename <- function(wtp_data){
  25. renamed <- selectNames(wtp_data,tpf.oxides_ord);
  26. names(renamed) <- tpf.oxides_elements_ord;
  27. return(renamed);
  28. }
  29.  
  30. tpf.unrename <- function(mw, labels){
  31. renamed <- selectNames(mw,tpf.elements_ord);
  32. names(renamed) <- tpf.elements_rename;
  33. return(cbind(Name = labels, renamed[,colSums(renamed^2) !=0]));
  34. }
  35.  
  36. tpf.select_cations <- function(start,end){
  37. subs <- tpf.oxides_elements_ord[match(start,tpf.elements_ord):match(end,tpf.elements_ord)]
  38. return(subs);
  39. }
  40.  
  41. tpf.norm <- function(mw,sk){
  42. ccat <- tpf.select_cations('Si','C');
  43. an <- tpf.select_cations('F','Cl');
  44. cat_ws <- subset(tpf.elements,element %in% ccat)$weight;
  45. cat_cnt <- subset(tpf.elements,element %in% ccat)$cat_count;
  46. an_ws <- c(1,1);
  47. ws <- c(cat_ws/sk/cat_cnt,an_ws);
  48. ret <- rowApply('/',mw,ws);
  49. return(ret);
  50. }
  51.  
  52. tpf.normfcl <- function(mw,skfcl){
  53. ccat <- tpf.select_cations('Si','C');
  54. an <- tpf.select_cations('F','Cl');
  55. cat_ws <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
  56. an_ws <- subset(tpf.elements,element %in% an)$weight;
  57. ws <- c(cat_ws,an_ws/skfcl);
  58. ret <- rowApply('/',mw,ws);
  59. return(ret);
  60. }
  61.  
  62. tpf.normbt <- function(mw,sk){
  63. ccat1 <- c(tpf.select_cations('Si','Ca'));
  64. ccat2 <- c(tpf.select_cations('Ba','C'));
  65. an <- tpf.select_cations('F','Cl');
  66. cat1_ws <- subset(tpf.elements,element %in% ccat1)$weight;
  67. cat1_cnt <- subset(tpf.elements,element %in% ccat1)$cat_count;
  68. catt_ws <- c(1,1);
  69. cat2_ws <- subset(tpf.elements,element %in% ccat2)$weight;
  70. cat2_cnt <- subset(tpf.elements,element %in% ccat2)$cat_count;
  71. an_ws <- c(1,1);
  72. ws <- c(cat1_ws/sk/cat1_cnt,catt_ws,cat2_ws/sk/cat2_cnt,an_ws);
  73. ret <- rowApply('/',mw,ws);
  74. ret$Na <- 0.0;
  75. ret$K <- 0.0;
  76. return(ret);
  77. }
  78.  
  79. tpf.sumfcl <- function(mw,so,theta = 0.000001){
  80. cat <- c(tpf.select_cations('Si','Cl'));
  81. cat_ws <- subset(tpf.elements,element %in% cat)$weight;
  82. cat_ox <- subset(tpf.elements,element %in% cat)$an_count;
  83. cat_ox[25] <- 1;
  84. cat_ox[26] <- 1;
  85.  
  86. ds <- rowApply('*',mw,cat_ox/cat_ws);
  87.  
  88. s <-rowSums(ds);
  89. sfc <- (ds$F + ds$Cl);
  90. s <- s - sfc/2;
  91.  
  92. #return (ifelse (s > theta, so/s, 0.0));
  93. return (so/s);
  94. }
  95.  
  96.  
  97. tpf.sum <- function(mw,so,theta = 0.000001){
  98. cat <- c(tpf.select_cations('Si','C'));
  99. cat_ws <- subset(tpf.elements,element %in% cat)$weight;
  100. cat_ox <- subset(tpf.elements,element %in% cat)$an_count;
  101.  
  102. ds <- rowApply('*',mw,cat_ox/cat_ws);
  103.  
  104. s <-rowSums(ds);
  105.  
  106. #return (ifelse (s > theta, so/s, 0.0));
  107. return (so/s);
  108. }
  109.  
  110.  
  111. tpf.alal <- function(mw,siv){
  112. mw$Al4 <- ifelse(mw$Si+mw$Al>siv, ifelse(mw$Si<siv,siv-mw$Si,0),mw$Al);
  113. mw$Al6 <- mw$Al - mw$Al4;
  114. return(mw);
  115. }
  116.  
  117.  
  118. tpf.omesod_v <- function(mw,so,siv){
  119. rn <- tpf.rename(mw);
  120. clkm <- NULL;
  121. for(i in 1:nrow(rn))
  122. {
  123. clk <- tpf.omesod(rn[i,],so,siv);
  124. if (i == 1) { clkm = clk; }
  125. else { clkm = rbind(clkm,clk); }
  126. }
  127. return(tpf.unrename(clkm,mw$Name));
  128. }
  129.  
  130. tpf.omesod <- function(mw,so,siv){
  131. sk <- tpf.sum(mw,so);
  132. skfcl <- tpf.sumfcl(mw,so);
  133. mw1 <- tpf.norm(mw,sk);
  134. mw2 <- tpf.normfcl(mw1,skfcl);
  135. mw3 <- tpf.alal(mw2,siv);
  136. mw3$Fe = mw3$Fe3 + mw3$Fe2;
  137. return (mw3);
  138. }
  139.  
  140.  
  141. tpf.sumo <- function (mw){
  142. s <- 0;
  143. sfc <- 0;
  144. cat <- c(tpf.select_cations('Si','C'));
  145. cat_ox <- subset(tpf.elements,element %in% cat)$an_count;
  146. cat_cat <- subset(tpf.elements,element %in% cat)$cat_count;
  147.  
  148. clist <- c(c(cat_ox/cat_cat),c(1,1));
  149.  
  150. s <- rowApply('*',mw,clist);
  151. sfc <- 0.5*(mw$F+mw$Cl);
  152.  
  153. return (s-sfc);
  154. }
  155.  
  156.  
  157. tpf.fefe <- function(mw,ll,mm,theta = 0.000001){
  158. os = tpf.sumo(mw) + (mw$F + mw$Cl)/2;
  159.  
  160. os2 <- ll/os;
  161. mw1 <- rowApply('*',mw,os2);
  162. mw1[is.nan(mw1)] <- 0;
  163.  
  164. mw$Fe3 <- mm-2*os;
  165. mw$Fe2 <- mw$Fe - mw$Fe2;
  166.  
  167. print(mw1);
  168. return(mw);
  169.  
  170. #Non Vector Operation! Tests requried!
  171. for(i in 1:nrow(mw)) {
  172. row <- mw[i,];
  173. if( os<ll && row$Fe > (mm-2*os[i]))
  174. {
  175. # pass
  176. }
  177. else
  178. {
  179. mw[i,] <- mw1[i,];
  180. }
  181. }
  182. return(mw);
  183. }
  184.  
  185.  
  186. tpf.recalc_minaral <- function(mn, mw){
  187. rn <- tpf.rename(mw);
  188. clkm <- NULL;
  189. for(i in 1:nrow(rn))
  190. {
  191. clk <- tpf.recalc_minaral_r(mn, rn[i,]);
  192. if (i == 1) { clkm = clk; }
  193. else { clkm = rbind(clkm,clk); }
  194. }
  195. return(tpf.unrename(clkm,mw$Name));
  196. }
  197.  
  198.  
  199.  
  200. tpf.recalc_minaral_r <- function(mn, mw) {
  201.  
  202. if (mn %in% c("SCP")) {
  203. mw <- tpf.omesod(mw,33,999);
  204. sct <- mw$Si+mw$Al;
  205. kp <- ifelse(sct != 0, 12/sct, 0);
  206. mw <- rowApply('*',mw,kp);
  207. mw <- tpf.alal(mw, 12);
  208. mw$Fe <- mw$Fe3 + mw$Fe2;
  209. return(mw);
  210. }
  211. if (mn %in% c("SPR")) {
  212. mw <- tpf.omesod(mw,10,999);
  213. s <- rowSums(mw) - mw$F - mw$Cl;
  214. s <- ifelse(s != 0, 7/s, 0);
  215. mw <- rowApply('*',mw,s);
  216. mw$Fe <- mw$Fe3 + mw$Fe2;
  217. mw$Fe2 <- mw$Fe;
  218. mw$Fe3 <- 0;
  219. mw <- tpf.fefe(mw, 10,20);
  220. mw <- tpf.alal(mw, 3);
  221. return(mw);
  222. }
  223. if (mn %in% c("ILM", "HEM")) {
  224. mw <- tpf.omesod(mw,3,999);
  225. s <- rowSums(mw) - mw$F - mw$Cl;
  226. s <- ifelse(s != 0, 2/s, 0);
  227. mw <- rowApply('*',mw,s);
  228. mw$Al4 <- mw$Al;
  229. mw$Al6 <- 0;
  230. mw$Fe <- mw$Fe3+mw$Fe2;
  231. mw$Fe2 <- mw$Fe;
  232. mw$Fe3 <- 0;
  233. mw <- tpf.fefe(mw, 3,6);
  234. return(mw);
  235. }
  236.  
  237. if (mn %in% c("MAG", "SPL")) {
  238. mw <- tpf.omesod(mw,4,999);
  239. s <- rowSums(mw) - mw$F - mw$Cl;
  240. s <- ifelse(s != 0, 3/s, 0);
  241. mw <- rowApply('*',mw,s);
  242. mw$Al4 <- mw$Al;
  243. mw$Al6 <- 0;
  244. mw$Fe <- mw$Fe3+mw$Fe2;
  245. mw$Fe2 <- mw$Fe;
  246. mw$Fe3 <- 0;
  247. mw <- tpf.fefe(mw, 4,8);
  248. return(mw);
  249. }
  250. if (mn %in% c("OPX", "PGT", "CPX")) {
  251. return(tpf.omesod(mw,6,2));
  252. }
  253. if (mn %in% c("GRT")) {
  254. return(tpf.omesod(mw,12,999));
  255. }
  256. if (mn %in% c("EP", "ZO")) {
  257. return(tpf.omesod(mw,12.5,999));
  258. }
  259. if (mn %in% c("CRD")) {
  260. return(tpf.omesod(mw,18,6));
  261. }
  262. if (mn %in% c("CAM", "HBL", "CUM", "ATH")) {
  263. return(tpf.omesod(mw,23,8));
  264. }
  265. if (mn %in% c("KFS", "PL")) {
  266. return(tpf.omesod(mw,8,999));
  267. }
  268. if (mn %in% c("BT", "MS")) {
  269. return(tpf.omesod(mw,11,4));
  270. }
  271. if (mn %in% c("OL", "MTC")) {
  272. return(tpf.omesod(mw,4,1));
  273. }
  274. if (mn %in% c("RT", "QTZ")) {
  275. return(tpf.omesod(mw,2,999));
  276. }
  277. if (mn %in% c("KY","AND","SIL","TTN")) {
  278. return(tpf.omesod(mw,5,999));
  279. }
  280. if (mn %in% c("L")) {
  281. return(tpf.omesod(mw,50,999));
  282. }
  283. if (mn %in% c("SID", "DOL", "MGS", "CAL", "FE", "WUS")) {
  284. return(tpf.omesod(mw,1,999));
  285. }
  286. if (mn %in% c("WO")) {
  287. return(tpf.omesod(mw,3,999));
  288. }
  289. if (mn %in% c("NE")) {
  290. return(tpf.omesod(mw,4,2));
  291. }
  292. if (mn %in% c("ST")) {
  293. return(tpf.omesod(mw,46,999));
  294. }
  295. if (mn %in% c("TLC")) {
  296. return(tpf.omesod(mw,11,999));
  297. }
  298. if (mn %in% c("CHL")) {
  299. return(tpf.omesod(mw,14,4));
  300. }
  301. if (mn %in% c("CHD")) {
  302. return(tpf.omesod(mw,12,999));
  303. }
  304. if (mn %in% c("OSU")) {
  305. return(tpf.omesod(mw,30,999));
  306. }
  307. if (mn %in% c("KRN")) {
  308. return(tpf.omesod(mw,43,999));
  309. }
  310. if (mn %in% c("STP")) {
  311. return(tpf.omesod(mw,23,999));
  312. }
  313. if (mn %in% c("HU")) {
  314. return(tpf.omesod(mw,13,999));
  315. }
  316. if (mn %in% c("CRN")) {
  317. return(tpf.omesod(mw,3,999));
  318. }
  319. }
  320.  
  321.  
  • utilities_tpf.1474030581.txt.gz
  • Последние изменения: 2018/11/12 15:08
  • (внешнее изменение)