コード例 #1
0
 def create_halite(self):    # NaCl
     # Major elements
     sodium = PeriodicSystem(name="Na").get_data()
     chlorine = PeriodicSystem(name="Cl").get_data()
     majors_name = ["Na", "Cl"]
     majors_data = np.array([["Na", sodium[1], 1, sodium[2]], ["Cl", chlorine[1], 1, chlorine[2]]], dtype=object)
     # Minor elements
     traces_data = []
     if len(self.traces_list) > 0:
         self.impurity = "impure"
     if self.impurity == "random":
         self.traces_list = []
         minors = ["I", "Br", "Fe", "O"]
         n = rd.randint(1, len(minors))
         while len(self.traces_list) < n:
             selection = rd.choice(minors)
             if selection not in self.traces_list and selection not in majors_name:
                 self.traces_list.append(selection)
             else:
                 continue
     traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
     x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
     for i in range(len(self.traces_list)):
         traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
     if len(traces_data) > 0:
         traces_data = np.array(traces_data, dtype=object)
         traces_data = traces_data[traces_data[:, 1].argsort()]
     #
     data = []
     #
     mineral = "Hl"
     #
     # Molar mass
     molar_mass_pure = sodium[2] + chlorine[2]
     molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
                                            majors=majors_data).calculate_molar_mass()
     element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
     # Density
     dataV = CrystalPhysics([[5.6404], [], "cubic"])
     V = dataV.calculate_volume()
     dataRho = CrystalPhysics([molar_mass, 4, V])
     rho = dataRho.calculate_bulk_density()
     rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
     # Bulk modulus
     K = 23*10**9
     # Shear modulus
     G = 14.33*10**9
     # Young's modulus
     E = (9*K*G)/(3*K + G)
     # Poisson's ratio
     nu = (3*K - 2*G)/(2*(3*K + G))
     # vP/vS
     vPvS = ((K + 4/3*G)/G)**0.5
     # P-wave velocity
     vP = ((K + 4/3*G)/rho)**0.5
     # S-wave velocity
     vS = (G/rho)**0.5
     # Gamma ray
     gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
     # Photoelectricity
     pe = wg(amounts=amounts, elements=element).calculate_pe()
     U = pe*rho_e*10**(-3)
     # Electrical resistivity
     p = 5*10**8
     #
     if self.dict == False:
         data.append(mineral)
         data.append(round(molar_mass, 3))
         data.append(round(rho, 2))
         data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
         data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
         data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
         data.append(amounts)
         #
         return data
     else:
         #
         results = {}
         results["mineral"] = mineral
         results["M"] = molar_mass
         element_list = np.array(amounts)[:, 0]
         results["chemistry"] = {}
         for index, element in enumerate(element_list, start=0):
             results["chemistry"][element] = amounts[index][2]
         results["rho"] = round(rho, 4)
         results["rho_e"] = round(rho_e, 4)
         results["V"] = round(V, 4)
         results["vP"] = round(vP, 4)
         results["vS"] = round(vS, 4)
         results["vP/vS"] = round(vPvS, 4)
         results["G"] = round(G*10**(-9), 4)
         results["K"] = round(K*10**(-9), 4)
         results["E"] = round(E*10**(-9), 4)
         results["nu"] = round(nu, 4)
         results["GR"] = round(gamma_ray, 4)
         results["PE"] = round(pe, 4)
         results["U"] = round(U, 4)
         if p != None:
             results["p"] = round(p, 4)
         else:
             results["p"] = p
         #
         return results
コード例 #2
0
 def create_aptite(self):  # Ca5 (F,Cl,OH) (PO4)3
     # Major elements
     hydrogen = PeriodicSystem(name="H").get_data()
     oxygen = PeriodicSystem(name="O").get_data()
     fluorine = PeriodicSystem(name="F").get_data()
     phosphorus = PeriodicSystem(name="P").get_data()
     chlorine = PeriodicSystem(name="Cl").get_data()
     calcium = PeriodicSystem(name="Ca").get_data()
     majors_name = ["H", "O", "F", "P", "Cl", "Ca"]
     a = round(rd.uniform(0, 1), 4)
     b = round(rd.uniform(0, (1 - a)), 4)
     c = round(1 - a - b, 4)
     majors_data = np.array([["H", hydrogen[1], c, hydrogen[2]],
                             ["O", oxygen[1], 12 + c, oxygen[2]],
                             ["F", fluorine[1], a, fluorine[2]],
                             ["P", phosphorus[1], 3, phosphorus[2]],
                             ["Cl", chlorine[1], b, chlorine[2]],
                             ["Ca", calcium[1], 5, calcium[2]]],
                            dtype=object)
     # Minor elements
     traces_data = []
     if len(self.traces_list) > 0:
         self.impurity = "impure"
     if self.impurity == "random":
         self.traces_list = []
         minors = [
             "La", "Ce", "Pr", "Nd", "Sm", "Eu", "Gd", "Dy", "Y", "Er", "Mn"
         ]
         n = rd.randint(1, len(minors))
         while len(self.traces_list) < n:
             selection = rd.choice(minors)
             if selection not in self.traces_list and selection not in majors_name:
                 self.traces_list.append(selection)
             else:
                 continue
     traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
     x_traces = [
         round(rd.uniform(0., 0.001), 6)
         for i in range(len(self.traces_list))
     ]
     for i in range(len(self.traces_list)):
         traces_data.append([
             str(self.traces_list[i]),
             int(traces[i][1]),
             float(x_traces[i])
         ])
     if len(traces_data) > 0:
         traces_data = np.array(traces_data, dtype=object)
         traces_data = traces_data[traces_data[:, 1].argsort()]
     #
     data = []
     mineral = "Ap"
     #
     # Molar mass
     molar_mass_pure = 5 * calcium[2] + a * fluorine[2] + b * chlorine[
         2] + c * (hydrogen[2] + oxygen[2]) + 3 * (phosphorus[2] +
                                                   4 * oxygen[2])
     molar_mass, amounts = MineralChemistry(
         w_traces=traces_data,
         molar_mass_pure=molar_mass_pure,
         majors=majors_data).calculate_molar_mass()
     element = [
         PeriodicSystem(name=amounts[i][0]).get_data()
         for i in range(len(amounts))
     ]
     # Density
     dataV_F = CrystalPhysics([[9.367, 6.884], [], "hexagonal"])
     V_F = dataV_F.calculate_volume()
     Z_F = 2
     V_m_F = MineralChemistry().calculate_molar_volume(volume_cell=V_F,
                                                       z=Z_F)
     dataRho_F = CrystalPhysics([molar_mass, Z_F, V_F * 10**(6)])
     rho_F = dataRho_F.calculate_bulk_density()
     rho_e_F = wg(amounts=amounts, elements=element,
                  rho_b=rho_F).calculate_electron_density()
     #
     dataV_Cl = CrystalPhysics([[9.598, 6.776], [], "hexagonal"])
     V_Cl = dataV_Cl.calculate_volume()
     Z_Cl = 2
     V_m_Cl = MineralChemistry().calculate_molar_volume(volume_cell=V_Cl,
                                                        z=Z_Cl)
     dataRho_Cl = CrystalPhysics([molar_mass, Z_Cl, V_Cl * 10**(6)])
     rho_Cl = dataRho_Cl.calculate_bulk_density()
     rho_e_Cl = wg(amounts=amounts, elements=element,
                   rho_b=rho_Cl).calculate_electron_density()
     #
     dataV_OH = CrystalPhysics([[9.418, 6.875], [], "hexagonal"])
     V_OH = dataV_OH.calculate_volume()
     Z_OH = 2
     V_m_OH = MineralChemistry().calculate_molar_volume(volume_cell=V_OH,
                                                        z=Z_OH)
     dataRho_OH = CrystalPhysics([molar_mass, Z_OH, V_OH * 10**(6)])
     rho_OH = dataRho_OH.calculate_bulk_density()
     rho_e_OH = wg(amounts=amounts, elements=element,
                   rho_b=rho_OH).calculate_electron_density()
     #
     V_m = a * V_m_F + b * V_m_Cl + c * V_m_OH
     rho = a * rho_F + b * rho_Cl + c * rho_OH
     rho_e = a * rho_e_F + b * rho_e_Cl + c * rho_e_OH
     # Bulk modulus
     K_F = 83 * 10**9
     K_Cl = 98.70 * 10**9
     K_OH = 105.01 * 10**9
     K = a * K_F + b * K_Cl + c * K_OH
     # Shear modulus
     G_F = 41 * 10**9
     G_Cl = 61.17 * 10**9
     G_OH = 62.69 * 10**9
     G = a * G_F + b * G_Cl + c * G_OH
     # Young's modulus
     E = (9 * K * G) / (3 * K + G)
     # Poisson's ratio
     nu = (3 * K - 2 * G) / (2 * (3 * K + G))
     # vP/vS
     vPvS = ((K + 4 / 3 * G) / G)**0.5
     # P-wave velocity
     vP = ((K + 4 / 3 * G) / rho)**0.5
     # S-wave velocity
     vS = (G / rho)**0.5
     # Gamma ray
     gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
     # Photoelectricity
     pe = wg(amounts=amounts, elements=element).calculate_pe()
     U = pe * rho_e * 10**(-3)
     # Electrical resistivity
     p = None
     #
     if self.data_type == False:
         data.append(mineral)
         data.append(round(molar_mass, 3))
         data.append(round(rho, 2))
         data.append([
             round(K * 10**(-9), 2),
             round(G * 10**(-9), 2),
             round(E * 10**(-9), 2),
             round(nu, 4)
         ])
         data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
         data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
         data.append(amounts)
         #
         return data
     else:
         #
         results = {}
         results["mineral"] = mineral
         results["M"] = molar_mass
         element_list = np.array(amounts)[:, 0]
         results["chemistry"] = {}
         for index, element in enumerate(element_list, start=0):
             results["chemistry"][element] = amounts[index][2]
         results["rho"] = round(rho, 4)
         results["rho_e"] = round(rho_e, 4)
         results["V"] = round(V_m, 4)
         results["vP"] = round(vP, 4)
         results["vS"] = round(vS, 4)
         results["vP/vS"] = round(vPvS, 4)
         results["G"] = round(G * 10**(-9), 4)
         results["K"] = round(K * 10**(-9), 4)
         results["E"] = round(E * 10**(-9), 4)
         results["nu"] = round(nu, 4)
         results["GR"] = round(gamma_ray, 4)
         results["PE"] = round(pe, 4)
         results["U"] = round(U, 4)
         if p != None:
             results["p"] = round(p, 4)
         else:
             results["p"] = p
         #
         return results
コード例 #3
0
ファイル: phospides.py プロジェクト: MABeeskow/GebPy
 def create_allabogdanite(self):  # (Fe,Ni)2 P
     #
     name = "Abgd"
     #
     # Major elements
     phosphorus = PeriodicSystem(name="P").get_data()
     iron = PeriodicSystem(name="Fe").get_data()
     nickel = PeriodicSystem(name="Ni").get_data()
     majors_name = ["P", "Fe", "Ni"]
     w_Fe = round(rd.uniform(0.25, 0.75), 4)
     majors_data = np.array(
         [["P", phosphorus[1], 1, phosphorus[2]],
          ["Fe", iron[1], round(2 * w_Fe, 4), iron[2]],
          ["Ni", nickel[1],
           round(2 * (1 - w_Fe), 4), nickel[2]]],
         dtype=object)
     # Minor elements
     traces_data = []
     if len(self.traces_list) > 0:
         self.impurity = "impure"
     if self.impurity == "pure":
         var_state = "variable"
     else:
         var_state = "variable"
         if self.impurity == "random":
             self.traces_list = []
             minors = [None]
             n = rd.randint(1, len(minors))
             while len(self.traces_list) < n:
                 selection = rd.choice(minors)
                 if selection not in self.traces_list and selection not in majors_name:
                     self.traces_list.append(selection)
                 else:
                     continue
     traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
     x_traces = [
         round(rd.uniform(0., 0.001), 6)
         for i in range(len(self.traces_list))
     ]
     for i in range(len(self.traces_list)):
         traces_data.append([
             str(self.traces_list[i]),
             int(traces[i][1]),
             float(x_traces[i])
         ])
     if len(traces_data) > 0:
         traces_data = np.array(traces_data, dtype=object)
         traces_data = traces_data[traces_data[:, 1].argsort()]
     #
     # Molar mass
     molar_mass_pure = 2 * (w_Fe * iron[2] +
                            (1 - w_Fe) * nickel[2]) + phosphorus[2]
     molar_mass, amounts = MineralChemistry(
         w_traces=traces_data,
         molar_mass_pure=molar_mass_pure,
         majors=majors_data).calculate_molar_mass()
     element = [
         PeriodicSystem(name=amounts[i][0]).get_data()
         for i in range(len(amounts))
     ]
     # Density
     dataV_Fe = CrystalPhysics([[5.811, 3.431], [], "hexagonal"])
     V_Fe = dataV_Fe.calculate_volume()
     Z_Fe = 3
     V_m_Fe = MineralChemistry().calculate_molar_volume(volume_cell=V_Fe,
                                                        z=Z_Fe)
     dataRho_Fe = CrystalPhysics([molar_mass, Z_Fe, V_Fe * 10**(6)])
     rho_Fe = dataRho_Fe.calculate_bulk_density()
     rho_e_Fe = wg(amounts=amounts, elements=element,
                   rho_b=rho_Fe).calculate_electron_density()
     #
     dataV_Ni = CrystalPhysics([[5.873, 3.349], [], "hexagonal"])
     V_Ni = dataV_Ni.calculate_volume()
     Z_Ni = 3
     V_m_Ni = MineralChemistry().calculate_molar_volume(volume_cell=V_Ni,
                                                        z=Z_Ni)
     dataRho_Ni = CrystalPhysics([molar_mass, Z_Ni, V_Ni * 10**(6)])
     rho_Ni = dataRho_Ni.calculate_bulk_density()
     rho_e_Ni = wg(amounts=amounts, elements=element,
                   rho_b=rho_Ni).calculate_electron_density()
     #
     V_m = w_Fe * V_m_Fe + (1 - w_Fe) * V_m_Ni
     rho = w_Fe * rho_Fe + (1 - w_Fe) * rho_Ni
     rho_e = w_Fe * rho_e_Fe + (1 - w_Fe) * rho_e_Ni
     # Bulk modulus
     K_Fe = 216 * 10**9
     K_Ni = 194 * 10**9
     K = w_Fe * K_Fe + (1 - w_Fe) * K_Ni
     # Shear modulus
     G_Fe = 89 * 10**9
     G_Ni = 42 * 10**9
     G = w_Fe * G_Fe + (1 - w_Fe) * G_Ni
     # Young's modulus
     E = (9 * K * G) / (3 * K + G)
     # Poisson's ratio
     nu = (3 * K - 2 * G) / (2 * (3 * K + G))
     # vP/vS
     vPvS = ((K + 4 / 3 * G) / G)**0.5
     # P-wave velocity
     vP = ((K + 4 / 3 * G) / rho)**0.5
     # S-wave velocity
     vS = (G / rho)**0.5
     # Gamma ray
     gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
     # Photoelectricity
     pe = wg(amounts=amounts, elements=element).calculate_pe()
     U = pe * rho_e * 10**(-3)
     # Electrical resistivity
     p = None
     #
     if self.data_type == False:
         data = []
         data.append(name)
         data.append(round(molar_mass, 3))
         data.append(round(rho, 2))
         data.append([
             round(K * 10**(-9), 2),
             round(G * 10**(-9), 2),
             round(E * 10**(-9), 2),
             round(nu, 4)
         ])
         data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
         data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
         data.append(amounts)
         #
         return data
     else:
         results = {}
         results["mineral"] = name
         results["state"] = var_state
         results["M"] = molar_mass
         element_list = np.array(amounts)[:, 0]
         results["chemistry"] = {}
         for index, element in enumerate(element_list, start=0):
             results["chemistry"][element] = amounts[index][2]
         results["rho"] = round(rho, 4)
         results["rho_e"] = round(rho_e, 4)
         results["V"] = round(V_m, 4)
         results["vP"] = round(vP, 4)
         results["vS"] = round(vS, 4)
         results["vP/vS"] = round(vPvS, 4)
         results["G"] = round(G * 10**(-9), 4)
         results["K"] = round(K * 10**(-9), 4)
         results["E"] = round(E * 10**(-9), 4)
         results["nu"] = round(nu, 4)
         results["GR"] = round(gamma_ray, 4)
         results["PE"] = round(pe, 4)
         results["U"] = round(U, 4)
         if p != None:
             results["p"] = round(p, 4)
         else:
             results["p"] = p
         #
         return results
コード例 #4
0
 def create_aptite_f(self):  # Ca5 F (PO4)3
     # Major elements
     oxygen = PeriodicSystem(name="O").get_data()
     fluorine = PeriodicSystem(name="F").get_data()
     phosphorus = PeriodicSystem(name="P").get_data()
     calcium = PeriodicSystem(name="Ca").get_data()
     majors_name = ["O", "F", "P", "Ca"]
     majors_data = np.array([["O", oxygen[1], 12, oxygen[2]],
                             ["F", fluorine[1], 1, fluorine[2]],
                             ["P", phosphorus[1], 3, phosphorus[2]],
                             ["Ca", calcium[1], 5, calcium[2]]],
                            dtype=object)
     # Minor elements
     traces_data = []
     if len(self.traces_list) > 0:
         self.impurity = "impure"
     if self.impurity == "pure":
         var_state = "fixed"
     else:
         var_state = "variable"
         self.traces_list = []
         minors_x = ["Ti", "Zr", "Hf", "Th"]  # mainly 4+
         minors_y = [
             "La", "Ce", "Pr", "Nd", "Sm", "Eu", "Gd", "Dy", "Y", "Er",
             "Cr", "As"
         ]  # mainly 3+
         minors_z = ["Cl", "H", "Rb"]  # mainly 1+
         minors_w = ["Mn", "Co", "Sr", "Ba", "Pb"]  # mainly 2+
         if self.impurity == "random":
             n_x = rd.randint(0, len(minors_x))
             n_y = rd.randint(0, len(minors_y))
             n_w = rd.randint(0, len(minors_w))
             if n_x > 0:
                 selection_x = rd.sample(minors_x, n_x)
                 self.traces_list.extend(selection_x)
             if n_y > 0 and n_w == 0:
                 n_z = rd.randint(1, n_y)
                 selection_y = rd.sample(minors_y, n_y)
                 selection_z = rd.sample(minors_z, n_z)
                 self.traces_list.extend(selection_y)
                 self.traces_list.extend(selection_z)
             if n_w > 0 and n_y == 0:
                 n_z = rd.randint(1, n_w)
                 selection_w = rd.sample(minors_w, n_w)
                 selection_z = rd.sample(minors_z, n_z)
                 self.traces_list.extend(selection_w)
                 self.traces_list.extend(selection_z)
             if n_y > 0 and n_w > 0:
                 if n_y + n_w <= len(minors_z):
                     n_z = rd.randint(1, (n_y + n_w))
                 else:
                     n_z = len(minors_z)
                 selection_y = rd.sample(minors_y, n_y)
                 selection_w = rd.sample(minors_w, n_w)
                 selection_z = rd.sample(minors_z, n_z)
                 self.traces_list.extend(selection_y)
                 self.traces_list.extend(selection_w)
                 self.traces_list.extend(selection_z)
         elif self.impurity != "random":
             self.traces_list = []
             for element in self.impurity:
                 if element in minors_x:
                     self.traces_list.append(element)
                 elif element in minors_y:
                     self.traces_list.append(element)
                 elif element in minors_z:
                     self.traces_list.append(element)
                 elif element in minors_w:
                     self.traces_list.append(element)
             # minors = ["Cl", "La", "Ce", "Pr", "Nd", "Sm", "Eu", "Gd", "Dy", "Y", "Er", "Mn", "H"]
             # n = rd.randint(1, len(minors))
             # while len(self.traces_list) < n:
             #     selection = rd.choice(minors)
             #     if selection not in self.traces_list and selection not in majors_name:
             #         self.traces_list.append(selection)
             #     else:
             #         continue
         traces = [
             PeriodicSystem(name=i).get_data() for i in self.traces_list
         ]
         x_traces = [
             round(rd.uniform(0., 0.001), 6)
             for i in range(len(self.traces_list))
         ]
         for i in range(len(self.traces_list)):
             traces_data.append([
                 str(self.traces_list[i]),
                 int(traces[i][1]),
                 float(x_traces[i])
             ])
         if len(traces_data) > 0:
             traces_data = np.array(traces_data, dtype=object)
             traces_data = traces_data[traces_data[:, 1].argsort()]
     #
     data = []
     mineral = "Ap"
     #
     # Molar mass
     try:
         molar_mass_pure = 5 * calcium[2] + fluorine[2] + 3 * (
             phosphorus[2] + 4 * oxygen[2])
         molar_mass, amounts = MineralChemistry(
             w_traces=traces_data,
             molar_mass_pure=molar_mass_pure,
             majors=majors_data).calculate_molar_mass()
         element = [
             PeriodicSystem(name=amounts[i][0]).get_data()
             for i in range(len(amounts))
         ]
     except:
         compositon_data = TraceElements(
             tracer=self.traces_list).calculate_composition_apatite_f()
         molar_mass = 0
         amounts = []
         for element in compositon_data:
             chem_data = PeriodicSystem(name=element).get_data()
             molar_mass += compositon_data[element]["x"] * chem_data[2]
             amounts.append([
                 chem_data[0], chem_data[1], compositon_data[element]["w"]
             ])
         element = [
             PeriodicSystem(name=amounts[i][0]).get_data()
             for i in range(len(amounts))
         ]
     # Density
     dataV = CrystalPhysics([[9.367, 6.884], [], "hexagonal"])
     V = dataV.calculate_volume()
     Z = 2
     V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
     dataRho = CrystalPhysics([molar_mass, Z, V * 10**(6)])
     rho = dataRho.calculate_bulk_density()
     rho_e = wg(amounts=amounts, elements=element,
                rho_b=rho).calculate_electron_density()
     # Bulk modulus
     K = 83 * 10**9
     # Shear modulus
     G = 41 * 10**9
     # Young's modulus
     E = (9 * K * G) / (3 * K + G)
     # Poisson's ratio
     nu = (3 * K - 2 * G) / (2 * (3 * K + G))
     # vP/vS
     vPvS = ((K + 4 / 3 * G) / G)**0.5
     # P-wave velocity
     vP = ((K + 4 / 3 * G) / rho)**0.5
     # S-wave velocity
     vS = (G / rho)**0.5
     # Gamma ray
     gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
     # Photoelectricity
     pe = wg(amounts=amounts, elements=element).calculate_pe()
     U = pe * rho_e * 10**(-3)
     # Electrical resistivity
     p = None
     #
     if self.data_type == False:
         data.append(mineral)
         data.append(round(molar_mass, 3))
         data.append(round(rho, 2))
         data.append([
             round(K * 10**(-9), 2),
             round(G * 10**(-9), 2),
             round(E * 10**(-9), 2),
             round(nu, 4)
         ])
         data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
         data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
         data.append(amounts)
         #
         return data
     else:
         #
         results = {}
         results["mineral"] = mineral
         results["M"] = molar_mass
         results["state"] = var_state
         element_list = np.array(amounts)[:, 0]
         results["chemistry"] = {}
         for index, element in enumerate(element_list, start=0):
             results["chemistry"][element] = amounts[index][2]
         results["rho"] = round(rho, 4)
         results["rho_e"] = round(rho_e, 4)
         results["V"] = round(V_m, 4)
         results["vP"] = round(vP, 4)
         results["vS"] = round(vS, 4)
         results["vP/vS"] = round(vPvS, 4)
         results["G"] = round(G * 10**(-9), 4)
         results["K"] = round(K * 10**(-9), 4)
         results["E"] = round(E * 10**(-9), 4)
         results["nu"] = round(nu, 4)
         results["GR"] = round(gamma_ray, 4)
         results["PE"] = round(pe, 4)
         results["U"] = round(U, 4)
         if p != None:
             results["p"] = round(p, 4)
         else:
             results["p"] = p
         #
         return results
コード例 #5
0
 def create_aptite_cl(self):  # Ca5 Cl (PO4)3
     # Major elements
     oxygen = PeriodicSystem(name="O").get_data()
     phosphorus = PeriodicSystem(name="P").get_data()
     chlorine = PeriodicSystem(name="Cl").get_data()
     calcium = PeriodicSystem(name="Ca").get_data()
     majors_name = ["O", "P", "Cl", "Ca"]
     majors_data = np.array([["O", oxygen[1], 12, oxygen[2]],
                             ["P", phosphorus[1], 3, phosphorus[2]],
                             ["Cl", chlorine[1], 1, chlorine[2]],
                             ["Ca", calcium[1], 5, calcium[2]]],
                            dtype=object)
     # Minor elements
     traces_data = []
     if len(self.traces_list) > 0:
         self.impurity = "impure"
     if self.impurity == "random":
         self.traces_list = []
         minors = [
             "F", "La", "Ce", "Pr", "Nd", "Sm", "Eu", "Gd", "Dy", "Y", "Er",
             "Mn", "H"
         ]
         n = rd.randint(1, len(minors))
         while len(self.traces_list) < n:
             selection = rd.choice(minors)
             if selection not in self.traces_list and selection not in majors_name:
                 self.traces_list.append(selection)
             else:
                 continue
     traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
     x_traces = [
         round(rd.uniform(0., 0.001), 6)
         for i in range(len(self.traces_list))
     ]
     for i in range(len(self.traces_list)):
         traces_data.append([
             str(self.traces_list[i]),
             int(traces[i][1]),
             float(x_traces[i])
         ])
     if len(traces_data) > 0:
         traces_data = np.array(traces_data, dtype=object)
         traces_data = traces_data[traces_data[:, 1].argsort()]
     #
     data = []
     mineral = "Ap"
     #
     # Molar mass
     molar_mass_pure = 5 * calcium[2] + chlorine[2] + 3 * (phosphorus[2] +
                                                           4 * oxygen[2])
     molar_mass, amounts = MineralChemistry(
         w_traces=traces_data,
         molar_mass_pure=molar_mass_pure,
         majors=majors_data).calculate_molar_mass()
     element = [
         PeriodicSystem(name=amounts[i][0]).get_data()
         for i in range(len(amounts))
     ]
     # Density
     dataV = CrystalPhysics([[9.598, 6.776], [], "hexagonal"])
     V = dataV.calculate_volume()
     Z = 2
     V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
     dataRho = CrystalPhysics([molar_mass, Z, V * 10**(6)])
     rho = dataRho.calculate_bulk_density()
     rho_e = wg(amounts=amounts, elements=element,
                rho_b=rho).calculate_electron_density()
     # Bulk modulus
     K = 98.70 * 10**9
     # Shear modulus
     G = 61.17 * 10**9
     # Young's modulus
     E = (9 * K * G) / (3 * K + G)
     # Poisson's ratio
     nu = (3 * K - 2 * G) / (2 * (3 * K + G))
     # vP/vS
     vPvS = ((K + 4 / 3 * G) / G)**0.5
     # P-wave velocity
     vP = ((K + 4 / 3 * G) / rho)**0.5
     # S-wave velocity
     vS = (G / rho)**0.5
     # Gamma ray
     gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
     # Photoelectricity
     pe = wg(amounts=amounts, elements=element).calculate_pe()
     U = pe * rho_e * 10**(-3)
     # Electrical resistivity
     p = None
     #
     if self.data_type == False:
         data.append(mineral)
         data.append(round(molar_mass, 3))
         data.append(round(rho, 2))
         data.append([
             round(K * 10**(-9), 2),
             round(G * 10**(-9), 2),
             round(E * 10**(-9), 2),
             round(nu, 4)
         ])
         data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
         data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
         data.append(amounts)
         #
         return data
     else:
         #
         results = {}
         results["mineral"] = mineral
         results["M"] = molar_mass
         element_list = np.array(amounts)[:, 0]
         results["chemistry"] = {}
         for index, element in enumerate(element_list, start=0):
             results["chemistry"][element] = amounts[index][2]
         results["rho"] = round(rho, 4)
         results["rho_e"] = round(rho_e, 4)
         results["V"] = round(V_m, 4)
         results["vP"] = round(vP, 4)
         results["vS"] = round(vS, 4)
         results["vP/vS"] = round(vPvS, 4)
         results["G"] = round(G * 10**(-9), 4)
         results["K"] = round(K * 10**(-9), 4)
         results["E"] = round(E * 10**(-9), 4)
         results["nu"] = round(nu, 4)
         results["GR"] = round(gamma_ray, 4)
         results["PE"] = round(pe, 4)
         results["U"] = round(U, 4)
         if p != None:
             results["p"] = round(p, 4)
         else:
             results["p"] = p
         #
         return results
コード例 #6
0
 def create_illite(self):  # (K,H3O) (Al,Mg,Fe)2 (Si,Al)4 O10 [(OH)2,(H2O)]
     # Major elements
     hydrogen = PeriodicSystem(name="H").get_data()
     oxygen = PeriodicSystem(name="O").get_data()
     magnesium = PeriodicSystem(name="Mg").get_data()
     aluminium = PeriodicSystem(name="Al").get_data()
     silicon = PeriodicSystem(name="Si").get_data()
     potassium = PeriodicSystem(name="K").get_data()
     iron = PeriodicSystem(name="Fe").get_data()
     majors_name = ["H", "O", "Mg", "Al", "Si", "K", "Fe"]
     #
     a = round(rd.uniform(0.6, 0.8), 4)
     b = round(rd.uniform(0.75, 1.0), 4)
     b2 = round(rd.uniform(0.0, float(1 - b)), 4)
     c = round(rd.uniform(0.975, 1.0), 4)
     d = round(rd.uniform(0.75, 1.0), 4)
     #
     majors_data = np.array(
         [["H", hydrogen[1], 3 * (1 - a) + 4 * d, hydrogen[2]],
          ["O", oxygen[1], (1 - a) + 10 + 3 * d, oxygen[2]],
          ["Mg", magnesium[1], 2 * b2, magnesium[2]],
          ["Al", aluminium[1], 2 * b + 4 *
           (1 - c), aluminium[2]], ["Si", silicon[1], 4 * c, silicon[2]],
          ["K", potassium[1], a, potassium[2]],
          ["Fe", iron[1], 2 * (1 - b - b2), iron[2]]],
         dtype=object)
     # Minor elements
     traces_data = []
     if len(self.traces_list) > 0:
         self.impurity = "impure"
     if self.impurity == "random":
         self.traces_list = []
         minors = [None]
         n = rd.randint(1, len(minors))
         while len(self.traces_list) < n:
             selection = rd.choice(minors)
             if selection not in self.traces_list and selection not in majors_name:
                 self.traces_list.append(selection)
             else:
                 continue
     traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
     x_traces = [
         round(rd.uniform(0., 0.001), 6)
         for i in range(len(self.traces_list))
     ]
     for i in range(len(self.traces_list)):
         traces_data.append([
             str(self.traces_list[i]),
             int(traces[i][1]),
             float(x_traces[i])
         ])
     if len(traces_data) > 0:
         traces_data = np.array(traces_data, dtype=object)
         traces_data = traces_data[traces_data[:, 1].argsort()]
     #
     mineral = "Ilt"
     #
     # Molar mass
     molar_mass_pure = a*potassium[2] + (1-a)*(3*hydrogen[2] + oxygen[2]) \
                       + 2*(b*aluminium[2] + b2*magnesium[2] + (1-b-b2)*iron[2]) \
                       + 4*(c*silicon[2] + (1-c)*aluminium[2]) + 10*oxygen[2] \
                       + d*(2*(oxygen[2]+hydrogen[2]) + (2*hydrogen[2]+oxygen[2]))
     molar_mass, amounts = MineralChemistry(
         w_traces=traces_data,
         molar_mass_pure=molar_mass_pure,
         majors=majors_data).calculate_molar_mass()
     element = [
         PeriodicSystem(name=amounts[i][0]).get_data()
         for i in range(len(amounts))
     ]
     # Density
     dataV = CrystalPhysics([[5.18, 8.98, 10.32], [101.83], "monoclinic"])
     V = dataV.calculate_volume()
     dataRho = CrystalPhysics([molar_mass, 2, V])
     rho = dataRho.calculate_bulk_density()
     rho_e = wg(amounts=amounts, elements=element,
                rho_b=rho).calculate_electron_density()
     # Bulk modulus
     K = (35.72 + (62.21 - 35.72) / (2.706 - 2.546) *
          (rho / 1000 - 2.546)) * 10**9
     # Shear modulus
     G = (17.80 + (25.70 - 17.80) / (2.706 - 2.546) *
          (rho / 1000 - 2.546)) * 10**9
     # Young's modulus
     E = (9 * K * G) / (3 * K + G)
     # Poisson's ratio
     nu = (3 * K - 2 * G) / (2 * (3 * K + G))
     # vP/vS
     vPvS = ((K + 4 / 3 * G) / G)**0.5
     # P-wave velocity
     vP = ((K + 4 / 3 * G) / rho)**0.5
     # S-wave velocity
     vS = (G / rho)**0.5
     # Gamma ray
     gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
     # Photoelectricity
     pe = wg(amounts=amounts, elements=element).calculate_pe()
     U = pe * rho_e * 10**(-3)
     # Electrical resistivity
     p = None
     #
     if self.dict == False:
         data = []
         data.append(mineral)
         data.append(round(molar_mass, 3))
         data.append(round(rho, 2))
         data.append([
             round(K * 10**(-9), 2),
             round(G * 10**(-9), 2),
             round(E * 10**(-9), 2),
             round(nu, 4)
         ])
         data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
         data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
         data.append(amounts)
         #
         return data
     else:
         #
         results = {}
         results["mineral"] = mineral
         results["M"] = round(molar_mass, 3)
         element_list = np.array(amounts)[:, 0]
         results["chemistry"] = {}
         for index, element in enumerate(element_list, start=0):
             results["chemistry"][element] = amounts[index][2]
         results["rho"] = round(rho, 4)
         results["rho_e"] = round(rho_e, 4)
         results["V"] = round(V, 4)
         results["vP"] = round(vP, 4)
         results["vS"] = round(vS, 4)
         results["vP/vS"] = round(vPvS, 4)
         results["G"] = round(G * 10**(-9), 4)
         results["K"] = round(K * 10**(-9), 4)
         results["E"] = round(E * 10**(-9), 4)
         results["nu"] = round(nu, 4)
         results["GR"] = round(gamma_ray, 4)
         results["PE"] = round(pe, 4)
         results["U"] = round(U, 4)
         if p != None:
             results["p"] = round(p, 4)
         else:
             results["p"] = p
         #
         return results
コード例 #7
0
 def create_montmorillonite(self):  # (Na,Ca)0.3(Al,Mg)2Si4O10(OH2)(H2O)10
     # Major elements
     hydrogen = PeriodicSystem(name="H").get_data()
     oxygen = PeriodicSystem(name="O").get_data()
     sodium = PeriodicSystem(name="Na").get_data()
     magnesium = PeriodicSystem(name="Mg").get_data()
     aluminium = PeriodicSystem(name="Al").get_data()
     silicon = PeriodicSystem(name="Si").get_data()
     calcium = PeriodicSystem(name="Ca").get_data()
     majors_name = ["H", "O", "Na", "Mg", "Al", "Si", "Ca"]
     #
     x = round(rd.uniform(0.6, 0.7), 2)
     y = round(rd.uniform(0.9, 1), 2)
     n = rd.randint(10, 12)
     #
     majors_data = np.array(
         [["H", hydrogen[1], 2 + 2 * n, hydrogen[2]],
          ["O", oxygen[1], 10 + 2 + n, oxygen[2]],
          ["Na", sodium[1], 0.3 * x, sodium[2]],
          ["Mg", magnesium[1], 2 * (1 - y), magnesium[2]],
          ["Al", aluminium[1], 2 * y, aluminium[2]],
          ["Si", silicon[1], 4, silicon[2]],
          ["Ca", calcium[1], 0.3 * (1 - x), calcium[2]]],
         dtype=object)
     # Minor elements
     traces_data = []
     if len(self.traces_list) > 0:
         self.impurity = "impure"
     if self.impurity == "random":
         self.traces_list = []
         minors = ["Fe", "K"]
         n = rd.randint(1, len(minors))
         while len(self.traces_list) < n:
             selection = rd.choice(minors)
             if selection not in self.traces_list and selection not in majors_name:
                 self.traces_list.append(selection)
             else:
                 continue
     traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
     x_traces = [
         round(rd.uniform(0., 0.001), 6)
         for i in range(len(self.traces_list))
     ]
     for i in range(len(self.traces_list)):
         traces_data.append([
             str(self.traces_list[i]),
             int(traces[i][1]),
             float(x_traces[i])
         ])
     if len(traces_data) > 0:
         traces_data = np.array(traces_data, dtype=object)
         traces_data = traces_data[traces_data[:, 1].argsort()]
     #
     mineral = "Mnt"
     #
     # Molar mass
     molar_mass_pure = 0.3*(x*sodium[2]+(1-x)*calcium[2]) + 2*(y*aluminium[2]+(1-y)*magnesium[2]) + 4*silicon[2] \
                       + 10*oxygen[2] + 2*(hydrogen[2]+oxygen[2]) + n*(2*hydrogen[2]+oxygen[2])
     molar_mass, amounts = MineralChemistry(
         w_traces=traces_data,
         molar_mass_pure=molar_mass_pure,
         majors=majors_data).calculate_molar_mass()
     element = [
         PeriodicSystem(name=amounts[i][0]).get_data()
         for i in range(len(amounts))
     ]
     # Density
     dataV = CrystalPhysics([[5.17, 8.94, 9.95], [99.9], "monoclinic"])
     V = dataV.calculate_volume()
     dataRho = CrystalPhysics([molar_mass, 1, V])
     rho = dataRho.calculate_bulk_density()
     rho_e = wg(amounts=amounts, elements=element,
                rho_b=rho).calculate_electron_density()
     # Bulk modulus
     x_rho = [2738, 2788, 3250, 2504, 3182]
     y_K = [37.30, 35.31, 49.46, 29.71, 66.59]
     a_K, b_K, r_value_K, p_value_K, std_err_K = stats.linregress(
         x_rho, y_K)
     K = (a_K * rho + b_K) * 10**9
     # Shear modulus
     y_G = [17.00, 20.19, 24.70, 16.30, 27.00]
     a_G, b_G, r_value_G, p_value_G, std_err_G = stats.linregress(
         x_rho, y_G)
     G = (a_G * rho + b_G) * 10**9
     # Young's modulus
     E = (9 * K * G) / (3 * K + G)
     # Poisson's ratio
     nu = (3 * K - 2 * G) / (2 * (3 * K + G))
     # vP/vS
     vPvS = ((K + 4 / 3 * G) / G)**0.5
     # P-wave velocity
     vP = ((K + 4 / 3 * G) / rho)**0.5
     # S-wave velocity
     vS = (G / rho)**0.5
     # Gamma ray
     gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
     # Photoelectricity
     pe = wg(amounts=amounts, elements=element).calculate_pe()
     U = pe * rho_e * 10**(-3)
     # Electrical resistivity
     p = None
     #
     if self.dict == False:
         data = []
         data.append(mineral)
         data.append(round(molar_mass, 3))
         data.append(round(rho, 2))
         data.append([
             round(K * 10**(-9), 2),
             round(G * 10**(-9), 2),
             round(E * 10**(-9), 2),
             round(nu, 4)
         ])
         data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
         data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
         data.append(amounts)
         #
         return data
     else:
         #
         results = {}
         results["mineral"] = mineral
         results["M"] = round(molar_mass, 3)
         element_list = np.array(amounts)[:, 0]
         results["chemistry"] = {}
         for index, element in enumerate(element_list, start=0):
             results["chemistry"][element] = amounts[index][2]
         results["rho"] = round(rho, 4)
         results["rho_e"] = round(rho_e, 4)
         results["V"] = round(V, 4)
         results["vP"] = round(vP, 4)
         results["vS"] = round(vS, 4)
         results["vP/vS"] = round(vPvS, 4)
         results["G"] = round(G * 10**(-9), 4)
         results["K"] = round(K * 10**(-9), 4)
         results["E"] = round(E * 10**(-9), 4)
         results["nu"] = round(nu, 4)
         results["GR"] = round(gamma_ray, 4)
         results["PE"] = round(pe, 4)
         results["U"] = round(U, 4)
         if p != None:
             results["p"] = round(p, 4)
         else:
             results["p"] = p
         #
         return results
コード例 #8
0
 def create_kaolinite(self):  # Al2(OH)4Si2O5
     # Major elements
     hydrogen = PeriodicSystem(name="H").get_data()
     oxygen = PeriodicSystem(name="O").get_data()
     aluminium = PeriodicSystem(name="Al").get_data()
     silicon = PeriodicSystem(name="Si").get_data()
     majors_name = ["H", "O", "Al", "Si"]
     #
     majors_data = np.array([["H", hydrogen[1], 4, hydrogen[2]],
                             ["O", oxygen[1], 9, oxygen[2]],
                             ["Al", aluminium[1], 2, aluminium[2]],
                             ["Si", silicon[1], 2, silicon[2]]],
                            dtype=object)
     # Minor elements
     traces_data = []
     if len(self.traces_list) > 0:
         self.impurity = "impure"
     if self.impurity == "random":
         self.traces_list = []
         minors = ["Fe", "Mg", "Na", "K", "Ti", "Ca"]
         n = rd.randint(1, len(minors))
         while len(self.traces_list) < n:
             selection = rd.choice(minors)
             if selection not in self.traces_list and selection not in majors_name:
                 self.traces_list.append(selection)
             else:
                 continue
     traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
     x_traces = [
         round(rd.uniform(0., 0.001), 6)
         for i in range(len(self.traces_list))
     ]
     for i in range(len(self.traces_list)):
         traces_data.append([
             str(self.traces_list[i]),
             int(traces[i][1]),
             float(x_traces[i])
         ])
     if len(traces_data) > 0:
         traces_data = np.array(traces_data, dtype=object)
         traces_data = traces_data[traces_data[:, 1].argsort()]
     #
     mineral = "Kln"
     #
     # Molar mass
     molar_mass_pure = 2 * aluminium[2] + 4 * (
         oxygen[2] + hydrogen[2]) + 2 * silicon[2] + 5 * oxygen[2]
     molar_mass, amounts = MineralChemistry(
         w_traces=traces_data,
         molar_mass_pure=molar_mass_pure,
         majors=majors_data).calculate_molar_mass()
     element = [
         PeriodicSystem(name=amounts[i][0]).get_data()
         for i in range(len(amounts))
     ]
     # Density
     dataV = CrystalPhysics([[5.13, 8.89, 7.25], [90.0, 104.5, 89.8],
                             "triclinic"])
     V = dataV.calculate_volume()
     dataRho = CrystalPhysics([molar_mass, 2, V])
     rho = dataRho.calculate_bulk_density()
     rho_e = wg(amounts=amounts, elements=element,
                rho_b=rho).calculate_electron_density()
     # Bulk modulus
     K = 122.54 * 10**9
     # Shear modulus
     G = 66.63 * 10**9
     # Young's modulus
     E = (9 * K * G) / (3 * K + G)
     # Poisson's ratio
     nu = (3 * K - 2 * G) / (2 * (3 * K + G))
     # vP/vS
     vPvS = ((K + 4 / 3 * G) / G)**0.5
     # P-wave velocity
     vP = ((K + 4 / 3 * G) / rho)**0.5
     # S-wave velocity
     vS = (G / rho)**0.5
     # Gamma ray
     gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
     # Photoelectricity
     pe = wg(amounts=amounts, elements=element).calculate_pe()
     U = pe * rho_e * 10**(-3)
     # Electrical resistivity
     p = None
     #
     if self.dict == False:
         data = []
         data.append(mineral)
         data.append(round(molar_mass, 3))
         data.append(round(rho, 2))
         data.append([
             round(K * 10**(-9), 2),
             round(G * 10**(-9), 2),
             round(E * 10**(-9), 2),
             round(nu, 4)
         ])
         data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
         data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
         data.append(amounts)
         #
         return data
     else:
         #
         results = {}
         results["mineral"] = mineral
         results["M"] = round(molar_mass, 3)
         element_list = np.array(amounts)[:, 0]
         results["chemistry"] = {}
         for index, element in enumerate(element_list, start=0):
             results["chemistry"][element] = amounts[index][2]
         results["rho"] = round(rho, 4)
         results["rho_e"] = round(rho_e, 4)
         results["V"] = round(V, 4)
         results["vP"] = round(vP, 4)
         results["vS"] = round(vS, 4)
         results["vP/vS"] = round(vPvS, 4)
         results["G"] = round(G * 10**(-9), 4)
         results["K"] = round(K * 10**(-9), 4)
         results["E"] = round(E * 10**(-9), 4)
         results["nu"] = round(nu, 4)
         results["GR"] = round(gamma_ray, 4)
         results["PE"] = round(pe, 4)
         results["U"] = round(U, 4)
         if p != None:
             results["p"] = round(p, 4)
         else:
             results["p"] = p
         #
         return results