Краткое описание сенсора
| Article | А. Г. Симакин, О. Ю. Шапошникова Новый амфиболовый геобарометр для высокомагнезиальных андезитовых и базальтовых магм, 2017 [ref] |
|---|---|
| Collibration | Как выполнялась калибровка |
| Precision | ± 1 kbar |
| Ranges | 950<T<1050oC; 2<P<15 kbar |
| Renew sensors | Обновляет сенсоры (если имеются) |
#Загрузка файла с методом пересчета
source('recalc_amp_13ecnk.r');
#Основная функция сенсора
sensors.p.amp_simakin <- function(Amp, usePFU = FALSE, ...){
#Параметр usePFU позволяет пропускать пересчет, предполагая, что на входе уже к.ф.
if(!usePFU) Amp <- recalc.amp_13ecnk(Amp);
#Расчет "давления" по точкам во всем наборе
P <- 16.051*(1.8*Amp$Al_c6_pfu/(1.8-Amp$Fe_p3_pfu-Amp$Ti_C_pfu-Amp$Cr_C_pfu))-7.819;
#Максимальное значение
Pmax <- max(P)
Pmean <- mean(P[Pmax-P <= 1])
comm <- 'norm'
#нужно прокомментировать, что при Рmax<2 расплав был кислым или амфибол заместил другую фазу при реакции с расплавом 'silicious or replace'
if(Pmax<1.5){Pmax<-0; comm <-'silicious or replacement'}
#нужно прокомментировать, что среди них есть закалочный кристалл или метаморфический 'quenching or metamorphic'
if(Pmax>15){Pmax<-100; comm <-'quenching or metamorphic'}
if(Pmax==0){Pmean<-0}
if(Pmax==100){Pmean<-0}
n1 <- nrow(Amp)
ij <- 1:n1
# Упорядочение значений "давления" во всех точках состава
for (j in 1:n1) {
for (i in 1:(n1-1)) {
if (P[i+1]>P[i]){z<-P[i]; P[i]<-P[i+1]; P[i+1]<-z;
# nam<-Amp$Name[i]; Amp$Name[i]<-Amp$Name[i+1]; Amp$Name[i+1]<-nam; }
li<-Amp[i, ]; Amp[i, ]<-Amp[i+1, ]; Amp[i+1, ]<-li; }
}};
# j<-1; for(j in 1:n1) {while (P[1]-P[j]<1.0}{break}
# k<-1; while(k<=j){sum<-sum+P[k]/j}
df1<-data.frame(Name='Summary', P_max=Pmax,P_mean=Pmean,comment=comm,n_points=n1,end=' ');
df2<-data.frame(Name=Amp$Name, P_max=P,P_mean=0.0,comment=' ',n_points=' ',end=' ');
df0<-data.frame(Name='_', P_max=0.0,P_mean=0.0,comment='_',n_points=' ',end=' ');
return (rbind(df1,df0,df2));
# return (data.frame(Name=Amp$Name, P_max=replicate(nrow(Amp), Pmax), P_mean=replicate(nrow(Amp), Pmean)));
}
#Функция определяющая входные параметры сенсора
sensors.p.amp_simakin.args <- function() {
ars <- list();
#Список минералов в данном случае 1 элемент
ars$minerals = c('Amp');
ars$ranges = c();
return(ars);
}
#Функция тестирования
sensors.p.amp_simakin.test <- function() {
#Тестовый набор данных
test_data = data.frame(Name=c('test1', 'test2'), SiO2_wtp=c(42.890, 42.890),
TiO2_wtp=c(1.800, 1.800), Al2O3_wtp=c(11.550, 11.550),
FeO_wtp=c(14.960, 14.960), MgO_wtp=c(11.120, 11.120),
CaO_wtp=c(11.490, 11.490), Na2O_wtp=c(1.870, 1.870),
K2O_wtp=c(1.060, 1.060));
#Расчет
result <- sensors.p.amp_simakin(test_data);
print(result);
#Проверка соответствия результат заданному значению
expect_equal(object = result[1,]$P_mean, 2.228, tolerance = 0.05);
}