DiadFit 0.0.88__py3-none-any.whl → 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- DiadFit/CO2_EOS.py +1320 -5
- DiadFit/CO2_in_bubble_error.py +91 -19
- DiadFit/__init__.py +1 -1
- DiadFit/_version.py +1 -1
- DiadFit/densimeters.py +9 -5
- DiadFit/diads.py +2 -0
- DiadFit/error_propagation.py +407 -152
- {DiadFit-0.0.88.dist-info → DiadFit-1.0.0.dist-info}/METADATA +1 -1
- {DiadFit-0.0.88.dist-info → DiadFit-1.0.0.dist-info}/RECORD +11 -12
- DiadFit/CO2_H2O_EOS.py +0 -1255
- {DiadFit-0.0.88.dist-info → DiadFit-1.0.0.dist-info}/WHEEL +0 -0
- {DiadFit-0.0.88.dist-info → DiadFit-1.0.0.dist-info}/top_level.txt +0 -0
DiadFit/error_propagation.py
CHANGED
@@ -8,6 +8,8 @@ from DiadFit.density_depth_crustal_profiles import *
|
|
8
8
|
from DiadFit.CO2_EOS import *
|
9
9
|
# This gets us the functions for Monte Carloing
|
10
10
|
from DiadFit.CO2_in_bubble_error import *
|
11
|
+
import multiprocessing as mp
|
12
|
+
np.random.seed(42)
|
11
13
|
|
12
14
|
## Microthermometry error propagation
|
13
15
|
|
@@ -275,7 +277,7 @@ error_XH2O=None, error_type_XH2O='Abs', error_dist_XH2O='normal',
|
|
275
277
|
# First need to work out what crustal density is
|
276
278
|
|
277
279
|
if type(crust_dens_kgm3) is float or type(crust_dens_kgm3) is int:
|
278
|
-
crust_dens_with_noise=add_noise_to_variable(crust_dens_kgm3,
|
280
|
+
crust_dens_with_noise=add_noise_to_variable(crust_dens_kgm3, error_crust_dens,
|
279
281
|
error_type_crust_dens, error_dist_crust_dens, N_dup, neg_values, neg_threshold=0.0000000001)
|
280
282
|
|
281
283
|
|
@@ -346,7 +348,8 @@ def convert_inputs_to_series(T_K, error_T_K, CO2_dens_gcm3, error_CO2_dens_gcm3,
|
|
346
348
|
|
347
349
|
|
348
350
|
|
349
|
-
def propagate_FI_uncertainty(sample_ID, CO2_dens_gcm3, T_K,
|
351
|
+
def propagate_FI_uncertainty(sample_ID, CO2_dens_gcm3, T_K, multiprocess='default', cores='default',
|
352
|
+
EOS='SW96', N_dup=1000,
|
350
353
|
plot_figure=False, fig_i=0,
|
351
354
|
error_CO2_dens=0, error_type_CO2_dens='Abs', error_dist_CO2_dens='normal',
|
352
355
|
crust_dens_kgm3=None,
|
@@ -354,7 +357,7 @@ error_CO2_dens=0, error_type_CO2_dens='Abs', error_dist_CO2_dens='normal',
|
|
354
357
|
model=None, d1=None, d2=None, rho1=None, rho2=None, rho3=None,
|
355
358
|
error_T_K=0, error_type_T_K='Abs', error_dist_T_K='normal',
|
356
359
|
XH2O=None, error_XH2O=0, error_type_XH2O='Abs', error_dist_XH2O='normal', Hloss=True,
|
357
|
-
neg_values=True
|
360
|
+
neg_values=True,
|
358
361
|
):
|
359
362
|
|
360
363
|
"""
|
@@ -367,6 +370,11 @@ neg_values=True
|
|
367
370
|
|
368
371
|
Parameters
|
369
372
|
-----------------
|
373
|
+
multiprocess: 'default' or bool
|
374
|
+
Default uses multiprocessing for Duan and Zhang (2006) but not for Span and Wanger or Sterner and Pitzer. This is because these EOS are so fast, making the multiprocess has a time penalty.
|
375
|
+
You can override this defualt by specifying True or False.
|
376
|
+
cores: 'default'
|
377
|
+
By default, if multiprocess, uses default number of cores selected by multiprocess, ca noverride.
|
370
378
|
sample_ID: pd.Series
|
371
379
|
Panda series of sample names. E.g., select a column from your dataframe (df['sample_name'])
|
372
380
|
|
@@ -479,7 +487,7 @@ neg_values=True
|
|
479
487
|
|
480
488
|
|
481
489
|
if XH2O is not None:
|
482
|
-
print('You have entered a value for XH2O, so we are now using the EOS of Duan and Zhang
|
490
|
+
print('You have entered a value for XH2O, so we are now using the EOS of Duan and Zhang 200 regardless of what model you selected. If you dont want this, specify XH2O=None')
|
483
491
|
print('Please note, the DZ2006 EOS is about 5-40X slower to run than the SP94 and SW94 EOS')
|
484
492
|
|
485
493
|
if isinstance(T_K, float) or isinstance(T_K, int) :
|
@@ -532,154 +540,207 @@ neg_values=True
|
|
532
540
|
|
533
541
|
#This loops through each fluid inclusion entered density
|
534
542
|
|
543
|
+
if multiprocess =='default':
|
544
|
+
if XH2O is None and EOS!='DZ06':
|
545
|
+
print('We are not using multiprocessing based on your selected EOS. You can override this by setting multiprocess=True in the function, but for SP94 and SW96 it might actually be slower')
|
546
|
+
multiprocess=False
|
547
|
+
else:
|
548
|
+
if XH2O is not None:
|
549
|
+
multiprocess=True
|
550
|
+
print('We are using multiprocessing based on your selected EOS. You can override this by setting multiprocess=False in the function, but it might slow it down a lot')
|
551
|
+
|
552
|
+
if multiprocess is False:
|
553
|
+
|
535
554
|
|
536
|
-
for i in tqdm(range(0, len_loop), desc="Processing"):
|
537
555
|
|
556
|
+
for i in tqdm(range(0, len_loop), desc="Processing"):
|
557
|
+
|
558
|
+
|
559
|
+
# This fills in the columns for the single calculation, e.g. no Monte-Carloing from above.
|
560
|
+
SingleCalc_D_km[i]=df_ind['Depth (km)'].iloc[i]
|
561
|
+
SingleCalc_Press_kbar[i]=df_ind['Pressure (kbar)'].iloc[i]
|
562
|
+
|
563
|
+
# Now lets get the value, using the function in the CO2_in_bubble_error.py file
|
564
|
+
error_T_K_i=get_value(error_T_K, i)
|
565
|
+
T_K_i=get_value(T_K, i)
|
566
|
+
|
567
|
+
CO2_dens_gcm3_i=get_value(CO2_dens_gcm3, i)
|
568
|
+
error_CO2_dens_i=get_value(error_CO2_dens, i)
|
569
|
+
|
570
|
+
crust_dens_kgm3_i=get_value(crust_dens_kgm3, i)
|
571
|
+
error_crust_dens_i=get_value(error_crust_dens, i)
|
572
|
+
# Now, if XH2O was entered, and isnt None, do the same. Else keeps as None.
|
573
|
+
if XH2O is not None:
|
574
|
+
error_XH2O_i=get_value(error_XH2O, i)
|
575
|
+
XH2O_i=get_value(XH2O, i)
|
576
|
+
|
577
|
+
|
578
|
+
|
579
|
+
# This is the function doing the work to actually make the simulations for each variable.
|
580
|
+
# For each input variable, it makes a distribution.
|
581
|
+
|
582
|
+
# If XH2O is None, it doesnt return the column XH2O_with_noise, which helps ID this later.
|
583
|
+
if XH2O is None:
|
584
|
+
|
585
|
+
df_synthetic=calculate_temperature_density_MC(N_dup=N_dup, CO2_dens_gcm3=CO2_dens_gcm3_i,
|
586
|
+
T_K=T_K_i, error_T_K=error_T_K_i, error_type_T_K=error_type_T_K, error_dist_T_K=error_dist_T_K,
|
587
|
+
error_CO2_dens=error_CO2_dens_i, error_type_CO2_dens=error_type_CO2_dens, error_dist_CO2_dens=error_dist_CO2_dens,
|
588
|
+
crust_dens_kgm3=crust_dens_kgm3_i, error_crust_dens=error_crust_dens_i, error_type_crust_dens= error_type_crust_dens, error_dist_crust_dens=error_dist_crust_dens,
|
589
|
+
model=model, neg_values=neg_values)
|
538
590
|
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
591
|
+
if model is None:
|
592
|
+
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
593
|
+
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
594
|
+
crust_dens_kgm3=df_synthetic['crust_dens_with_noise'],
|
595
|
+
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,model=model,
|
596
|
+
EOS=EOS )
|
597
|
+
else:
|
598
|
+
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
599
|
+
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
600
|
+
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,
|
601
|
+
model=model, EOS=EOS)
|
549
602
|
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
603
|
+
if XH2O is not None:
|
604
|
+
|
605
|
+
df_synthetic=calculate_temperature_density_MC(N_dup=N_dup, CO2_dens_gcm3=CO2_dens_gcm3_i,
|
606
|
+
T_K=T_K_i, error_T_K=error_T_K_i, error_type_T_K=error_type_T_K, error_dist_T_K=error_dist_T_K,
|
607
|
+
error_CO2_dens=error_CO2_dens_i, error_type_CO2_dens=error_type_CO2_dens, error_dist_CO2_dens=error_dist_CO2_dens,
|
608
|
+
crust_dens_kgm3=crust_dens_kgm3_i, error_crust_dens=error_crust_dens_i, error_type_crust_dens= error_type_crust_dens, error_dist_crust_dens=error_dist_crust_dens,
|
609
|
+
model=model, XH2O=XH2O_i, error_XH2O=error_XH2O_i, error_type_XH2O=error_type_XH2O, error_dist_XH2O=error_dist_XH2O, neg_values=neg_values)
|
556
610
|
|
611
|
+
EOS='DZ06'
|
612
|
+
|
557
613
|
|
614
|
+
# Convert to densities for MC
|
615
|
+
|
616
|
+
if model is None:
|
617
|
+
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
618
|
+
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
619
|
+
crust_dens_kgm3=df_synthetic['crust_dens_with_noise'],
|
620
|
+
XH2O=df_synthetic['XH2O_with_noise'], Hloss=Hloss,
|
621
|
+
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,model=model,
|
622
|
+
EOS=EOS )
|
623
|
+
else:
|
624
|
+
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
625
|
+
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
626
|
+
XH2O=df_synthetic['XH2O_with_noise'], Hloss=Hloss,
|
627
|
+
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,
|
628
|
+
model=model, EOS=EOS)
|
558
629
|
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
T_K=T_K_i, error_T_K=error_T_K_i, error_type_T_K=error_type_T_K, error_dist_T_K=error_dist_T_K,
|
567
|
-
error_CO2_dens=error_CO2_dens_i, error_type_CO2_dens=error_type_CO2_dens, error_dist_CO2_dens=error_dist_CO2_dens,
|
568
|
-
crust_dens_kgm3=crust_dens_kgm3_i, error_crust_dens=error_crust_dens_i, error_type_crust_dens= error_type_crust_dens, error_dist_crust_dens=error_dist_crust_dens,
|
569
|
-
model=model, neg_values=neg_values)
|
570
|
-
|
571
|
-
if model is None:
|
572
|
-
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
573
|
-
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
574
|
-
crust_dens_kgm3=df_synthetic['crust_dens_with_noise'],
|
575
|
-
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,model=model,
|
576
|
-
EOS=EOS )
|
630
|
+
|
631
|
+
# Check of
|
632
|
+
if sample_ID is None:
|
633
|
+
Sample[i]=i
|
634
|
+
|
635
|
+
elif isinstance(sample_ID, str):
|
636
|
+
Sample[i]=sample_ID
|
577
637
|
else:
|
578
|
-
|
579
|
-
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
580
|
-
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,
|
581
|
-
model=model, EOS=EOS)
|
638
|
+
Sample[i]=sample_ID.iloc[i]
|
582
639
|
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
crust_dens_kgm3=crust_dens_kgm3_i, error_crust_dens=error_crust_dens_i, error_type_crust_dens= error_type_crust_dens, error_dist_crust_dens=error_dist_crust_dens,
|
589
|
-
model=model, XH2O=XH2O_i, error_XH2O=error_XH2O_i, error_type_XH2O=error_type_XH2O, error_dist_XH2O=error_dist_XH2O, neg_values=neg_values)
|
590
|
-
|
591
|
-
|
592
|
-
# Convert to densities for MC
|
593
|
-
|
594
|
-
if model is None:
|
595
|
-
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
596
|
-
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
597
|
-
crust_dens_kgm3=df_synthetic['crust_dens_with_noise'],
|
598
|
-
XH2O=df_synthetic['XH2O_with_noise'], Hloss=Hloss,
|
599
|
-
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,model=model,
|
600
|
-
EOS=EOS )
|
640
|
+
MC_T.insert(0, 'Filename', Sample[i])
|
641
|
+
|
642
|
+
|
643
|
+
if isinstance(CO2_dens_gcm3, pd.Series):
|
644
|
+
CO2_density_input[i]=CO2_dens_gcm3.iloc[i]
|
601
645
|
else:
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
646
|
+
CO2_density_input=CO2_dens_gcm3
|
647
|
+
|
648
|
+
|
649
|
+
All_outputs=pd.concat([All_outputs, MC_T], axis=0)
|
650
|
+
|
651
|
+
|
652
|
+
mean_Press_kbar[i]=np.nanmean(MC_T['Pressure (kbar)'])
|
653
|
+
med_Press_kbar[i]=np.nanmedian(MC_T['Pressure (kbar)'])
|
654
|
+
std_Press_kbar[i]=np.nanstd(MC_T['Pressure (kbar)'])
|
655
|
+
var=MC_T['Pressure (kbar)']
|
656
|
+
std_Press_kbar_IQR[i]=0.5*np.abs((np.percentile(var, 84) -np.percentile(var, 16)))
|
657
|
+
|
658
|
+
mean_D_km[i]=np.nanmean(MC_T['Depth (km)'])
|
659
|
+
med_D_km[i]=np.nanmedian(MC_T['Depth (km)'])
|
660
|
+
std_D_km[i]=np.nanstd(MC_T['Depth (km)'])
|
661
|
+
var=MC_T['Depth (km)']
|
662
|
+
std_D_km_IQR[i]=0.5*np.abs((np.percentile(var, 84) -np.percentile(var, 16)))
|
663
|
+
|
664
|
+
error_crust_dens_loop[i]=np.nanmean(df_synthetic['error_crust_dens_kgm3'])
|
665
|
+
|
666
|
+
|
667
|
+
|
668
|
+
|
669
|
+
df_step=pd.DataFrame(data={'Filename': Sample,
|
670
|
+
'CO2_dens_gcm3': CO2_density_input,
|
671
|
+
'SingleCalc_D_km': SingleCalc_D_km,
|
672
|
+
'SingleCalc_P_kbar': SingleCalc_Press_kbar,
|
673
|
+
'Mean_MC_P_kbar': mean_Press_kbar,
|
674
|
+
'Med_MC_P_kbar': med_Press_kbar,
|
675
|
+
'std_dev_MC_P_kbar': std_Press_kbar,
|
676
|
+
'std_dev_MC_P_kbar_from_percentile': std_Press_kbar_IQR,
|
677
|
+
'Mean_MC_D_km': mean_D_km,
|
678
|
+
'Med_MC_D_km': med_D_km,
|
679
|
+
'std_dev_MC_D_km': std_D_km,
|
680
|
+
'std_dev_MC_D_km_from_percentile': std_D_km_IQR,
|
681
|
+
'T_K_input': T_K,
|
682
|
+
'error_T_K': error_T_K,
|
683
|
+
'CO2_dens_gcm3_input': CO2_dens_gcm3,
|
684
|
+
'error_CO2_dens_gcm3': error_CO2_dens,
|
685
|
+
'crust_dens_kgm3_input':crust_dens_kgm3,
|
686
|
+
'error_crust_dens_kgm3': error_crust_dens_loop,
|
687
|
+
'model': model,
|
688
|
+
'EOS': EOS
|
689
|
+
})
|
690
|
+
|
691
|
+
if XH2O is not None:
|
692
|
+
df_step['XH2O_input']=XH2O
|
693
|
+
df_step['error_XH2O']=error_XH2O
|
652
694
|
|
653
695
|
|
696
|
+
|
697
|
+
|
698
|
+
if multiprocess is True:
|
654
699
|
|
655
700
|
|
656
701
|
|
702
|
+
# Choose number of processes
|
703
|
+
|
704
|
+
if cores=='default':
|
705
|
+
print("Number of processors: ", mp.cpu_count())
|
706
|
+
pool = mp.Pool(mp.cpu_count())
|
707
|
+
else:
|
708
|
+
pool = mp.Pool(cores)
|
709
|
+
|
710
|
+
|
711
|
+
|
712
|
+
args=(sample_ID, df_ind, CO2_dens_gcm3, T_K, N_dup, EOS,
|
713
|
+
error_CO2_dens, error_type_CO2_dens, error_dist_CO2_dens,
|
714
|
+
crust_dens_kgm3,
|
715
|
+
error_crust_dens, error_type_crust_dens, error_dist_crust_dens,
|
716
|
+
model, d1, d2, rho1, rho2, rho3,
|
717
|
+
error_T_K, error_type_T_K, error_dist_T_K,
|
718
|
+
XH2O, error_XH2O, error_type_XH2O, error_dist_XH2O, Hloss,
|
719
|
+
neg_values)
|
657
720
|
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
df_step['error_type_XH2O']=error_type_XH2O
|
682
|
-
df_step['error_dist_XH2O']=error_dist_XH2O
|
721
|
+
|
722
|
+
|
723
|
+
results = [pool.apply_async(worker_function, args=(i, *args)) for i in range(len_loop)]
|
724
|
+
|
725
|
+
pool.close()
|
726
|
+
pool.join()
|
727
|
+
|
728
|
+
# Collect results
|
729
|
+
final_results = [r.get() for r in results]
|
730
|
+
|
731
|
+
# Initialize DataFrames
|
732
|
+
df_step = pd.DataFrame(data={'Filename': np.zeros(len_loop, dtype=np.dtype('U100'))})
|
733
|
+
All_outputs = pd.DataFrame([])
|
734
|
+
|
735
|
+
# Populate DataFrames
|
736
|
+
for result, MC_T in final_results:
|
737
|
+
i = result['i']
|
738
|
+
for key, value in result.items():
|
739
|
+
df_step.at[i, key] = value
|
740
|
+
|
741
|
+
All_outputs = pd.concat([All_outputs, MC_T], axis=0)
|
742
|
+
|
743
|
+
|
683
744
|
|
684
745
|
|
685
746
|
|
@@ -687,20 +748,61 @@ neg_values=True
|
|
687
748
|
|
688
749
|
|
689
750
|
if plot_figure is True:
|
690
|
-
df_1_sample=All_outputs.loc[All_outputs['Filename']==
|
751
|
+
df_1_sample=All_outputs.loc[All_outputs['Filename']==df_step['Filename'].iloc[fig_i]]
|
691
752
|
|
692
|
-
df_1_step=df_step.loc[df_step['Filename']==
|
753
|
+
df_1_step=df_step.loc[df_step['Filename']==df_step['Filename'].iloc[fig_i]]
|
693
754
|
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6)) = plt.subplots(3, 2, figsize=(12,8))
|
694
755
|
|
695
756
|
|
696
757
|
fig.suptitle('Simulations for sample = ' + str(All_outputs['Filename'].iloc[fig_i]), fontsize=20)
|
758
|
+
|
759
|
+
# Getting things to annotate
|
760
|
+
# Temperature
|
761
|
+
if isinstance(error_T_K, pd.Series):
|
762
|
+
error_T_K_plot = error_T_K.iloc[fig_i]
|
763
|
+
elif isinstance(error_T_K, np.ndarray):
|
764
|
+
error_T_K_plot = error_T_K[fig_i]
|
765
|
+
else:
|
766
|
+
error_T_K_plot = error_T_K
|
767
|
+
error_T_K_plot=np.round(error_T_K_plot, 1)
|
768
|
+
|
769
|
+
|
770
|
+
# Crustal density
|
771
|
+
if isinstance(error_crust_dens, pd.Series):
|
772
|
+
error_crust_dens_plot = error_crust_dens.iloc[fig_i]
|
773
|
+
elif isinstance(error_crust_dens, np.ndarray):
|
774
|
+
error_crust_dens_plot = error_crust_dens[fig_i]
|
775
|
+
else:
|
776
|
+
error_crust_dens_plot = error_crust_dens
|
777
|
+
error_crust_dens_plot=np.round(error_crust_dens_plot, 1)
|
778
|
+
|
779
|
+
# CO2 density
|
780
|
+
if isinstance(error_CO2_dens, pd.Series):
|
781
|
+
error_CO2_dens_plot = error_CO2_dens.iloc[fig_i]
|
782
|
+
elif isinstance(error_CO2_dens, np.ndarray):
|
783
|
+
error_CO2_dens_plot = error_CO2_dens[fig_i]
|
784
|
+
else:
|
785
|
+
error_CO2_dens_plot = error_CO2_dens
|
786
|
+
error_CO2_dens_plot=np.round(error_CO2_dens_plot, 3)
|
787
|
+
|
788
|
+
|
789
|
+
# XH2O
|
790
|
+
if isinstance(error_XH2O, pd.Series):
|
791
|
+
error_XH2O_plot = error_XH2O.iloc[fig_i]
|
792
|
+
elif isinstance(error_XH2O, np.ndarray):
|
793
|
+
error_XH2O_plot = error_XH2O[fig_i]
|
794
|
+
else:
|
795
|
+
error_XH2O_plot = error_XH2O
|
796
|
+
error_XH2O_plot=np.round(error_XH2O_plot, 3)
|
797
|
+
|
697
798
|
|
698
799
|
|
699
800
|
# Ax1 is temperature
|
700
801
|
if error_dist_T_K=='normal' and error_type_T_K == 'Abs':
|
701
|
-
ax1.set_title('Input distribution Temp: Normally-distributed, 1σ =' +str(
|
802
|
+
ax1.set_title('Input distribution Temp: Normally-distributed, 1σ =' +str(error_T_K_plot) + ' K')
|
702
803
|
if error_dist_T_K=='normal' and error_type_T_K == 'Perc':
|
703
|
-
ax1.set_title('Input distribution Temp: Normally-distributed, 1σ =' +str(
|
804
|
+
ax1.set_title('Input distribution Temp: Normally-distributed, 1σ =' +str(error_T_K_plot) + '%')
|
805
|
+
|
704
806
|
if df_1_step['error_T_K'][0]!=0:
|
705
807
|
ax1.hist(df_1_sample['MC_T_K'], color='red', ec='k')
|
706
808
|
else:
|
@@ -708,9 +810,9 @@ neg_values=True
|
|
708
810
|
|
709
811
|
# ax2 is CO2 density
|
710
812
|
if error_dist_CO2_dens=='normal' and error_type_CO2_dens == 'Abs':
|
711
|
-
ax2.set_title('Input distribution CO$_2$ density: Normally-distributed, 1σ =' +str(
|
813
|
+
ax2.set_title('Input distribution CO$_2$ density: Normally-distributed, 1σ =' +str(error_CO2_dens_plot) + ' g/cm$^{3}$')
|
712
814
|
if error_dist_CO2_dens=='normal' and error_type_CO2_dens == 'Perc':
|
713
|
-
ax2.set_title('Input distribution CO$_2$ density: Normally-distributed, 1σ =' +str(
|
815
|
+
ax2.set_title('Input distribution CO$_2$ density: Normally-distributed, 1σ =' +str(error_CO2_dens_plot) + '%')
|
714
816
|
if df_1_step['error_CO2_dens_gcm3'][0]!=0:
|
715
817
|
ax2.hist(df_1_sample['MC_CO2_dens_gcm3'], facecolor='white', ec='k')
|
716
818
|
else:
|
@@ -719,20 +821,20 @@ neg_values=True
|
|
719
821
|
|
720
822
|
# ax3 is the crustal density error
|
721
823
|
if error_dist_crust_dens=='normal' and error_type_crust_dens == 'Abs':
|
722
|
-
ax3.set_title('Input Distribution Crustal density: Normally-distributed, 1σ =' +str(
|
824
|
+
ax3.set_title('Input Distribution Crustal density: Normally-distributed, 1σ =' +str(error_crust_dens_plot) + 'kg/m$^{3}$')
|
723
825
|
if error_dist_crust_dens=='normal' and error_type_crust_dens == 'Perc':
|
724
|
-
ax3.set_title('Input distribution crustal density: Normally-distributed, 1σ =' +str(
|
826
|
+
ax3.set_title('Input distribution crustal density: Normally-distributed, 1σ =' +str(error_crust_dens_plot) + '%')
|
725
827
|
if model is None and df_1_step['error_crust_dens_kgm3'][0]!=0:
|
726
|
-
ax3.hist(df_1_sample['
|
828
|
+
ax3.hist(df_1_sample['MC_crust_dens_kgm3'], facecolor='white', ec='k')
|
727
829
|
else:
|
728
830
|
ax3.plot([0, 0], [0, N_dup], '-r')
|
729
831
|
ax3.ticklabel_format(useOffset=False)
|
730
832
|
|
731
833
|
# ax4 is XH2O
|
732
834
|
if error_dist_XH2O=='normal' and error_type_XH2O == 'Abs':
|
733
|
-
ax4.set_title('Input Distribution XH2O: Normally-distributed, 1σ =' +str(
|
835
|
+
ax4.set_title('Input Distribution XH2O: Normally-distributed, 1σ =' +str(error_XH2O_plot) + 'molar prop')
|
734
836
|
if error_dist_XH2O=='normal' and error_type_XH2O == 'Perc':
|
735
|
-
ax4.set_title('Input distribution XH2O: Normally-distributed, 1σ =' +str(
|
837
|
+
ax4.set_title('Input distribution XH2O: Normally-distributed, 1σ =' +str(error_XH2O_plot) + '%')
|
736
838
|
if XH2O is not None and df_1_step['error_XH2O'][0]!=0:
|
737
839
|
ax4.hist(df_1_sample['MC_XH2O'], facecolor='white', ec='k')
|
738
840
|
else:
|
@@ -763,6 +865,10 @@ neg_values=True
|
|
763
865
|
#return df_step, All_outputs, fig
|
764
866
|
|
765
867
|
return df_step, All_outputs,fig if 'fig' in locals() else None
|
868
|
+
|
869
|
+
|
870
|
+
|
871
|
+
|
766
872
|
|
767
873
|
|
768
874
|
## Actual functions doing the conversions
|
@@ -843,7 +949,7 @@ def convert_co2_dens_press_depth(EOS='SW96', T_K=None,
|
|
843
949
|
df=pd.DataFrame(data={'Pressure (kbar)': Pressure['P_kbar'],
|
844
950
|
'Pressure (MPa)': Pressure['P_MPa'],
|
845
951
|
'Depth (km)': Depth_km,
|
846
|
-
'
|
952
|
+
'MC_crust_dens_kgm3': crust_dens_kgm3,
|
847
953
|
'model': model,
|
848
954
|
'MC_T_K': T_K,
|
849
955
|
'MC_CO2_dens_gcm3': CO2_dens_gcm3}, index=[0])
|
@@ -854,7 +960,7 @@ def convert_co2_dens_press_depth(EOS='SW96', T_K=None,
|
|
854
960
|
df=pd.DataFrame(data={'Pressure (kbar)': Pressure['P_kbar'],
|
855
961
|
'Pressure (MPa)': Pressure['P_MPa'],
|
856
962
|
'Depth (km)': Depth_km,
|
857
|
-
'
|
963
|
+
'MC_crust_dens_kgm3': crust_dens_kgm3,
|
858
964
|
'model': model,
|
859
965
|
'MC_T_K': T_K,
|
860
966
|
'MC_CO2_dens_gcm3': CO2_dens_gcm3})
|
@@ -866,7 +972,7 @@ def convert_co2_dens_press_depth(EOS='SW96', T_K=None,
|
|
866
972
|
'Pressure (kbar)': [Pressure['P_kbar']],
|
867
973
|
'Pressure (MPa)': [Pressure['P_MPa']],
|
868
974
|
'Depth (km)': [Depth_km] if isinstance(Depth_km, float) else Depth_km,
|
869
|
-
'
|
975
|
+
'MC_crust_dens_kgm3': [crust_dens_kgm3],
|
870
976
|
'model': [model],
|
871
977
|
'MC_T_K': [T_K],
|
872
978
|
'MC_CO2_dens_gcm3': [CO2_dens_gcm3]
|
@@ -892,7 +998,7 @@ def convert_co2_dens_press_depth(EOS='SW96', T_K=None,
|
|
892
998
|
df=pd.DataFrame(data={'Pressure (kbar)': P_kbar_calc,
|
893
999
|
'Pressure (MPa)': 100*P_kbar_calc,
|
894
1000
|
'Depth (km)': Depth_km,
|
895
|
-
'
|
1001
|
+
'MC_crust_dens_kgm3': crust_dens_kgm3,
|
896
1002
|
'model': model,
|
897
1003
|
'MC_T_K': T_K,
|
898
1004
|
'MC_CO2_dens_gcm3': CO2_dens_gcm3,
|
@@ -904,7 +1010,7 @@ def convert_co2_dens_press_depth(EOS='SW96', T_K=None,
|
|
904
1010
|
df=pd.DataFrame(data={'Pressure (kbar)': P_kbar_calc,
|
905
1011
|
'Pressure (MPa)': 100*P_kbar_calc,
|
906
1012
|
'Depth (km)': Depth_km,
|
907
|
-
'
|
1013
|
+
'MC_crust_dens_kgm3': crust_dens_kgm3,
|
908
1014
|
'model': model,
|
909
1015
|
'MC_T_K': T_K,
|
910
1016
|
'MC_CO2_dens_gcm3': CO2_dens_gcm3,
|
@@ -915,11 +1021,160 @@ def convert_co2_dens_press_depth(EOS='SW96', T_K=None,
|
|
915
1021
|
df.replace([np.inf, -np.inf], np.nan, inplace=True)
|
916
1022
|
|
917
1023
|
return df
|
1024
|
+
|
1025
|
+
|
1026
|
+
## Now lets try to parallize it
|
1027
|
+
|
1028
|
+
def worker_function(i, sample_ID, df_ind, CO2_dens_gcm3, T_K, N_dup, EOS,
|
1029
|
+
error_CO2_dens, error_type_CO2_dens, error_dist_CO2_dens,
|
1030
|
+
crust_dens_kgm3,
|
1031
|
+
error_crust_dens, error_type_crust_dens, error_dist_crust_dens,
|
1032
|
+
model, d1, d2, rho1, rho2, rho3,
|
1033
|
+
error_T_K, error_type_T_K, error_dist_T_K,
|
1034
|
+
XH2O, error_XH2O, error_type_XH2O, error_dist_XH2O, Hloss,
|
1035
|
+
neg_values
|
1036
|
+
):
|
1037
|
+
|
1038
|
+
|
1039
|
+
# This fills in the columns for the single calculation, e.g. no Monte-Carloing from above.
|
1040
|
+
SingleCalc_D_km=df_ind['Depth (km)'].iloc[i]
|
1041
|
+
SingleCalc_Press_kbar=df_ind['Pressure (kbar)'].iloc[i]
|
1042
|
+
|
1043
|
+
# Now lets get the value, using the function in the CO2_in_bubble_error.py file
|
1044
|
+
T_K_i=get_value(T_K, i)
|
1045
|
+
error_T_K_i=get_value(error_T_K, i)
|
1046
|
+
|
1047
|
+
|
1048
|
+
CO2_dens_gcm3_i=get_value(CO2_dens_gcm3, i)
|
1049
|
+
error_CO2_dens_i=get_value(error_CO2_dens, i)
|
1050
|
+
|
1051
|
+
crust_dens_kgm3_i=get_value(crust_dens_kgm3, i)
|
1052
|
+
error_crust_dens_i=get_value(error_crust_dens, i)
|
1053
|
+
# Now, if XH2O was entered, and isnt None, do the same. Else keeps as None.
|
1054
|
+
if XH2O is not None:
|
1055
|
+
error_XH2O_i=get_value(error_XH2O, i)
|
1056
|
+
XH2O_i=get_value(XH2O, i)
|
1057
|
+
else:
|
1058
|
+
error_XH2O_i=0
|
1059
|
+
|
1060
|
+
if sample_ID is None:
|
1061
|
+
Sample[i]=i
|
1062
|
+
|
1063
|
+
elif isinstance(sample_ID, str):
|
1064
|
+
Sample=sample_ID
|
1065
|
+
else:
|
1066
|
+
Sample=sample_ID.iloc[i]
|
1067
|
+
|
1068
|
+
|
1069
|
+
|
1070
|
+
# This is the function doing the work to actually make the simulations for each variable.
|
1071
|
+
# For each input variable, it makes a distribution.
|
1072
|
+
|
1073
|
+
# If XH2O is None, it doesnt return the column XH2O_with_noise, which helps ID this later.
|
1074
|
+
if XH2O is None:
|
1075
|
+
|
1076
|
+
df_synthetic=calculate_temperature_density_MC(N_dup=N_dup, CO2_dens_gcm3=CO2_dens_gcm3_i,
|
1077
|
+
T_K=T_K_i, error_T_K=error_T_K_i, error_type_T_K=error_type_T_K, error_dist_T_K=error_dist_T_K,
|
1078
|
+
error_CO2_dens=error_CO2_dens_i, error_type_CO2_dens=error_type_CO2_dens, error_dist_CO2_dens=error_dist_CO2_dens,
|
1079
|
+
crust_dens_kgm3=crust_dens_kgm3_i, error_crust_dens=error_crust_dens_i, error_type_crust_dens= error_type_crust_dens, error_dist_crust_dens=error_dist_crust_dens,
|
1080
|
+
model=model, neg_values=neg_values)
|
1081
|
+
|
1082
|
+
if model is None:
|
1083
|
+
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
1084
|
+
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
1085
|
+
crust_dens_kgm3=df_synthetic['crust_dens_with_noise'],
|
1086
|
+
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,model=model,
|
1087
|
+
EOS=EOS )
|
1088
|
+
else:
|
1089
|
+
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
1090
|
+
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
1091
|
+
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,
|
1092
|
+
model=model, EOS=EOS)
|
918
1093
|
|
1094
|
+
if XH2O is not None:
|
1095
|
+
|
1096
|
+
df_synthetic=calculate_temperature_density_MC(N_dup=N_dup, CO2_dens_gcm3=CO2_dens_gcm3_i,
|
1097
|
+
T_K=T_K_i, error_T_K=error_T_K_i, error_type_T_K=error_type_T_K, error_dist_T_K=error_dist_T_K,
|
1098
|
+
error_CO2_dens=error_CO2_dens_i, error_type_CO2_dens=error_type_CO2_dens, error_dist_CO2_dens=error_dist_CO2_dens,
|
1099
|
+
crust_dens_kgm3=crust_dens_kgm3_i, error_crust_dens=error_crust_dens_i, error_type_crust_dens= error_type_crust_dens, error_dist_crust_dens=error_dist_crust_dens,
|
1100
|
+
model=model, XH2O=XH2O_i, error_XH2O=error_XH2O_i, error_type_XH2O=error_type_XH2O, error_dist_XH2O=error_dist_XH2O, neg_values=neg_values)
|
1101
|
+
|
1102
|
+
EOS='DZ06'
|
1103
|
+
|
919
1104
|
|
1105
|
+
# Convert to densities for MC
|
1106
|
+
|
1107
|
+
if model is None:
|
1108
|
+
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
1109
|
+
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
1110
|
+
crust_dens_kgm3=df_synthetic['crust_dens_with_noise'],
|
1111
|
+
XH2O=df_synthetic['XH2O_with_noise'], Hloss=Hloss,
|
1112
|
+
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,model=model,
|
1113
|
+
EOS=EOS )
|
1114
|
+
else:
|
1115
|
+
MC_T=convert_co2_dens_press_depth(T_K=df_synthetic['T_K_with_noise'],
|
1116
|
+
CO2_dens_gcm3=df_synthetic['CO2_dens_with_noise'],
|
1117
|
+
XH2O=df_synthetic['XH2O_with_noise'], Hloss=Hloss,
|
1118
|
+
d1=d1, d2=d2, rho1=rho1, rho2=rho2, rho3=rho3,
|
1119
|
+
model=model, EOS=EOS)
|
920
1120
|
|
921
1121
|
|
922
1122
|
|
923
1123
|
|
924
1124
|
|
1125
|
+
# Check of
|
1126
|
+
if sample_ID is None:
|
1127
|
+
Sample=i
|
1128
|
+
|
1129
|
+
elif isinstance(sample_ID, str):
|
1130
|
+
Sample=sample_ID
|
1131
|
+
else:
|
1132
|
+
Sample=sample_ID.iloc[i]
|
1133
|
+
|
1134
|
+
MC_T.insert(0, 'Filename', Sample)
|
1135
|
+
|
1136
|
+
|
1137
|
+
|
1138
|
+
CO2_density_input=CO2_dens_gcm3_i
|
1139
|
+
|
1140
|
+
|
1141
|
+
|
1142
|
+
|
1143
|
+
# Collect results
|
1144
|
+
result = {
|
1145
|
+
'i': i,
|
1146
|
+
'Filename': Sample,
|
1147
|
+
'CO2_density_input': CO2_dens_gcm3_i,
|
1148
|
+
'SingleCalc_D_km': df_ind['Depth (km)'].iloc[i],
|
1149
|
+
'SingleCalc_P_kbar': df_ind['Pressure (kbar)'].iloc[i],
|
1150
|
+
'Mean_MC_P_kbar': np.nanmean(MC_T['Pressure (kbar)']),
|
1151
|
+
'Med_MC_P_kbar': np.nanmedian(MC_T['Pressure (kbar)']),
|
1152
|
+
'std_dev_MC_P_kbar': np.nanstd(MC_T['Pressure (kbar)']),
|
1153
|
+
'std_dev_MC_P_kbar_from_percentile': 0.5*np.abs((np.percentile(MC_T['Pressure (kbar)'], 84) -np.percentile(MC_T['Pressure (kbar)'], 16))),
|
1154
|
+
'Mean_MC_D_km': np.nanmean(MC_T['Depth (km)']),
|
1155
|
+
'Med_MC_D_km': np.nanmedian(MC_T['Depth (km)']),
|
1156
|
+
'std_dev_MC_D_km': np.nanstd(MC_T['Depth (km)']),
|
1157
|
+
'std_dev_MC_D_km_from_percentile': 0.5*np.abs((np.percentile(MC_T['Depth (km)'], 84) -np.percentile(MC_T['Depth (km)'], 16))),
|
1158
|
+
'T_K_input': T_K_i,
|
1159
|
+
'error_T_K': error_T_K_i,
|
1160
|
+
'CO2_dens_gcm3_input': CO2_dens_gcm3_i,
|
1161
|
+
'error_CO2_dens_gcm3': error_CO2_dens_i,
|
1162
|
+
'crust_dens_kgm3_input':crust_dens_kgm3_i,
|
1163
|
+
'error_crust_dens_kgm3': error_crust_dens_i,
|
1164
|
+
'model': model,
|
1165
|
+
'EOS': EOS
|
1166
|
+
|
1167
|
+
}
|
1168
|
+
if XH2O is not None:
|
1169
|
+
result['XH2O_input']=XH2O_i
|
1170
|
+
result['error_XH2O']=error_XH2O_i
|
925
1171
|
|
1172
|
+
return result, MC_T
|
1173
|
+
|
1174
|
+
|
1175
|
+
|
1176
|
+
|
1177
|
+
|
1178
|
+
|
1179
|
+
|
1180
|
+
|