From a28e3357c72275d8659c69571dbcc8e4b0df60e2 Mon Sep 17 00:00:00 2001 From: Abdullah Ahmad Date: Sun, 5 Nov 2023 19:31:25 +0000 Subject: [PATCH] Setting up to merge to main Moving the original Python code to a reference folder. Need to flesh out the python library interface. --- reference/pyrism/Closures/__init__.py | 1 + .../pyrism/Closures/closure_dispatcher.py | 22 + reference/pyrism/Closures/closure_object.py | 39 + reference/pyrism/Closures/closure_routines.py | 69 + reference/pyrism/Core/Data.py | 97 ++ reference/pyrism/Core/Grid.py | 83 ++ reference/pyrism/Core/Site.py | 9 + reference/pyrism/Core/Species.py | 19 + reference/pyrism/Core/Transforms.py | 74 ++ reference/pyrism/Core/__init__.py | 5 + reference/pyrism/Functionals/__init__.py | 1 + .../Functionals/functional_dispatcher.py | 18 + .../pyrism/Functionals/functional_routines.py | 122 ++ reference/pyrism/IntegralEquations/DRISM.py | 187 +++ reference/pyrism/IntegralEquations/IE.py | 18 + reference/pyrism/IntegralEquations/XRISM.py | 109 ++ .../pyrism/IntegralEquations/XRISM_DB.py | 150 +++ .../pyrism/IntegralEquations/XRISM_UV.py | 20 + .../pyrism/IntegralEquations/XRISM_impl.py | 17 + .../pyrism/IntegralEquations/__init__.py | 1 + reference/pyrism/Potentials/#mixing.py# | 49 + reference/pyrism/Potentials/.#mixing.py | 1 + reference/pyrism/Potentials/__init__.py | 1 + reference/pyrism/Potentials/mixing.py | 52 + .../pyrism/Potentials/potential_dispatcher.py | 20 + .../pyrism/Potentials/potential_routines.py | 186 +++ reference/pyrism/Solvers/Gillan.py | 159 +++ reference/pyrism/Solvers/MDIIS.py | 214 +++ reference/pyrism/Solvers/Ng.py | 103 ++ reference/pyrism/Solvers/Picard.py | 86 ++ reference/pyrism/Solvers/Solver.py | 20 + reference/pyrism/Solvers/Solver_object.py | 39 + reference/pyrism/Solvers/__init__.py | 1 + reference/pyrism/Util/Rotation.py | 121 ++ reference/pyrism/Util/__init__.py | 3 + reference/pyrism/__init__.py | 15 + reference/pyrism/__main__.py | 42 + reference/pyrism/data/0008noc_chloro.toml | 77 ++ reference/pyrism/data/001tetr_1.toml | 44 + reference/pyrism/data/001tetr_1_maestro.toml | 44 + reference/pyrism/data/002eth.toml | 47 + reference/pyrism/data/003buta_12.toml | 53 + reference/pyrism/data/0111die.toml | 57 + reference/pyrism/data/0507iso.toml | 54 + reference/pyrism/data/0521dic.toml | 47 + reference/pyrism/data/1-hexanol.toml | 71 + reference/pyrism/data/1.toml | 55 + reference/pyrism/data/118wate_488.toml | 42 + reference/pyrism/data/24dimepen.toml | 62 + reference/pyrism/data/2_propanol.toml | 111 ++ reference/pyrism/data/2_propanol_salt.toml | 125 ++ reference/pyrism/data/Ethanol_wat.toml | 100 ++ reference/pyrism/data/HR1982.toml | 37 + reference/pyrism/data/HR1982N.toml | 35 + reference/pyrism/data/HR1982_Br2_I.toml | 40 + reference/pyrism/data/HR1982_Br2_III.toml | 40 + reference/pyrism/data/HR1982_Br2_IV.toml | 41 + reference/pyrism/data/HR1982_HCl_II.toml | 36 + reference/pyrism/data/HR1982_HCl_III.toml | 36 + .../pyrism/data/MSPCE_XRISM_methane.toml | 56 + .../pyrism/data/MSPCE_XRISM_methane_UA.toml | 52 + reference/pyrism/data/Methanol_cSPCE.toml | 82 ++ reference/pyrism/data/Methanol_lue.toml | 83 ++ reference/pyrism/data/Methanol_wat.toml | 84 ++ reference/pyrism/data/PK_ModelII.toml | 54 + reference/pyrism/data/PK_ModelIII.toml | 58 + reference/pyrism/data/RISM-MOL_methane.toml | 56 + reference/pyrism/data/SPC.toml | 41 + reference/pyrism/data/XRISM_DB.toml | 44 + reference/pyrism/data/argon.toml | 44 + reference/pyrism/data/argon_mono.toml | 44 + reference/pyrism/data/argon_uv.toml | 48 + reference/pyrism/data/cSPCE.toml | 43 + reference/pyrism/data/cSPCE_DRISM_butane.toml | 66 + reference/pyrism/data/cSPCE_DRISM_ethane.toml | 59 + .../pyrism/data/cSPCE_DRISM_methane.toml | 56 + reference/pyrism/data/cSPCE_DRISM_octane.toml | 78 ++ .../pyrism/data/cSPCE_DRISM_propane.toml | 62 + reference/pyrism/data/cSPCE_NaCl.toml | 58 + reference/pyrism/data/cSPCE_XRISM.toml | 43 + reference/pyrism/data/cSPCE_XRISM_butane.toml | 66 + reference/pyrism/data/cSPCE_XRISM_ethane.toml | 59 + reference/pyrism/data/cSPCE_XRISM_ethene.toml | 57 + .../pyrism/data/cSPCE_XRISM_methane.toml | 56 + .../pyrism/data/cSPCE_XRISM_methane_UA.toml | 52 + reference/pyrism/data/cSPCE_XRISM_octane.toml | 78 ++ .../pyrism/data/cSPCE_XRISM_propane.toml | 62 + reference/pyrism/data/chg_org_solu.toml | 49 + reference/pyrism/data/chloro.toml | 46 + reference/pyrism/data/chloro_cg.toml | 46 + reference/pyrism/data/ethene.toml | 44 + reference/pyrism/data/gillan_test.toml | 57 + reference/pyrism/data/nhexylbenzene.toml | 69 + reference/pyrism/data/nitromethane_resp.toml | 60 + .../pyrism/data/nitromethane_resp_wat.toml | 82 ++ reference/pyrism/data/org_solv.toml | 67 + reference/pyrism/data/rust_test.toml | 43 + reference/pyrism/plotter.py | 33 + reference/pyrism/rism_ctrl.py | 1148 +++++++++++++++++ reference/pyrism/tests/__init__.py | 3 + reference/pyrism/tests/inputs/24dimepen.toml | 62 + reference/pyrism/tests/inputs/2_propanol.toml | 111 ++ .../pyrism/tests/inputs/HR1982_Br2_IV.toml | 41 + reference/pyrism/tests/inputs/argon_uv.toml | 48 + reference/pyrism/tests/inputs/cSPCE.toml | 42 + reference/pyrism/tests/inputs/cSPCE_NaCl.toml | 57 + reference/pyrism/tests/inputs/chloro.toml | 46 + reference/pyrism/tests/inputs/chloro_cg.toml | 46 + .../pyrism/tests/inputs/nhexylbenzene.toml | 69 + reference/pyrism/tests/sfed_fft.py | 26 + reference/pyrism/tests/test_calculations.py | 122 ++ reference/pyrism/tests/test_thermo.py | 36 + 112 files changed, 7521 insertions(+) create mode 100644 reference/pyrism/Closures/__init__.py create mode 100644 reference/pyrism/Closures/closure_dispatcher.py create mode 100644 reference/pyrism/Closures/closure_object.py create mode 100644 reference/pyrism/Closures/closure_routines.py create mode 100644 reference/pyrism/Core/Data.py create mode 100644 reference/pyrism/Core/Grid.py create mode 100644 reference/pyrism/Core/Site.py create mode 100644 reference/pyrism/Core/Species.py create mode 100644 reference/pyrism/Core/Transforms.py create mode 100644 reference/pyrism/Core/__init__.py create mode 100644 reference/pyrism/Functionals/__init__.py create mode 100644 reference/pyrism/Functionals/functional_dispatcher.py create mode 100644 reference/pyrism/Functionals/functional_routines.py create mode 100644 reference/pyrism/IntegralEquations/DRISM.py create mode 100644 reference/pyrism/IntegralEquations/IE.py create mode 100644 reference/pyrism/IntegralEquations/XRISM.py create mode 100644 reference/pyrism/IntegralEquations/XRISM_DB.py create mode 100644 reference/pyrism/IntegralEquations/XRISM_UV.py create mode 100644 reference/pyrism/IntegralEquations/XRISM_impl.py create mode 100644 reference/pyrism/IntegralEquations/__init__.py create mode 100644 reference/pyrism/Potentials/#mixing.py# create mode 120000 reference/pyrism/Potentials/.#mixing.py create mode 100644 reference/pyrism/Potentials/__init__.py create mode 100644 reference/pyrism/Potentials/mixing.py create mode 100644 reference/pyrism/Potentials/potential_dispatcher.py create mode 100644 reference/pyrism/Potentials/potential_routines.py create mode 100644 reference/pyrism/Solvers/Gillan.py create mode 100644 reference/pyrism/Solvers/MDIIS.py create mode 100644 reference/pyrism/Solvers/Ng.py create mode 100644 reference/pyrism/Solvers/Picard.py create mode 100644 reference/pyrism/Solvers/Solver.py create mode 100644 reference/pyrism/Solvers/Solver_object.py create mode 100644 reference/pyrism/Solvers/__init__.py create mode 100644 reference/pyrism/Util/Rotation.py create mode 100644 reference/pyrism/Util/__init__.py create mode 100644 reference/pyrism/__init__.py create mode 100644 reference/pyrism/__main__.py create mode 100644 reference/pyrism/data/0008noc_chloro.toml create mode 100644 reference/pyrism/data/001tetr_1.toml create mode 100644 reference/pyrism/data/001tetr_1_maestro.toml create mode 100644 reference/pyrism/data/002eth.toml create mode 100644 reference/pyrism/data/003buta_12.toml create mode 100644 reference/pyrism/data/0111die.toml create mode 100644 reference/pyrism/data/0507iso.toml create mode 100644 reference/pyrism/data/0521dic.toml create mode 100644 reference/pyrism/data/1-hexanol.toml create mode 100644 reference/pyrism/data/1.toml create mode 100644 reference/pyrism/data/118wate_488.toml create mode 100644 reference/pyrism/data/24dimepen.toml create mode 100644 reference/pyrism/data/2_propanol.toml create mode 100644 reference/pyrism/data/2_propanol_salt.toml create mode 100644 reference/pyrism/data/Ethanol_wat.toml create mode 100644 reference/pyrism/data/HR1982.toml create mode 100644 reference/pyrism/data/HR1982N.toml create mode 100644 reference/pyrism/data/HR1982_Br2_I.toml create mode 100644 reference/pyrism/data/HR1982_Br2_III.toml create mode 100644 reference/pyrism/data/HR1982_Br2_IV.toml create mode 100644 reference/pyrism/data/HR1982_HCl_II.toml create mode 100644 reference/pyrism/data/HR1982_HCl_III.toml create mode 100644 reference/pyrism/data/MSPCE_XRISM_methane.toml create mode 100644 reference/pyrism/data/MSPCE_XRISM_methane_UA.toml create mode 100644 reference/pyrism/data/Methanol_cSPCE.toml create mode 100644 reference/pyrism/data/Methanol_lue.toml create mode 100644 reference/pyrism/data/Methanol_wat.toml create mode 100644 reference/pyrism/data/PK_ModelII.toml create mode 100644 reference/pyrism/data/PK_ModelIII.toml create mode 100644 reference/pyrism/data/RISM-MOL_methane.toml create mode 100644 reference/pyrism/data/SPC.toml create mode 100644 reference/pyrism/data/XRISM_DB.toml create mode 100644 reference/pyrism/data/argon.toml create mode 100644 reference/pyrism/data/argon_mono.toml create mode 100644 reference/pyrism/data/argon_uv.toml create mode 100644 reference/pyrism/data/cSPCE.toml create mode 100644 reference/pyrism/data/cSPCE_DRISM_butane.toml create mode 100644 reference/pyrism/data/cSPCE_DRISM_ethane.toml create mode 100644 reference/pyrism/data/cSPCE_DRISM_methane.toml create mode 100644 reference/pyrism/data/cSPCE_DRISM_octane.toml create mode 100644 reference/pyrism/data/cSPCE_DRISM_propane.toml create mode 100644 reference/pyrism/data/cSPCE_NaCl.toml create mode 100644 reference/pyrism/data/cSPCE_XRISM.toml create mode 100644 reference/pyrism/data/cSPCE_XRISM_butane.toml create mode 100644 reference/pyrism/data/cSPCE_XRISM_ethane.toml create mode 100644 reference/pyrism/data/cSPCE_XRISM_ethene.toml create mode 100644 reference/pyrism/data/cSPCE_XRISM_methane.toml create mode 100644 reference/pyrism/data/cSPCE_XRISM_methane_UA.toml create mode 100644 reference/pyrism/data/cSPCE_XRISM_octane.toml create mode 100644 reference/pyrism/data/cSPCE_XRISM_propane.toml create mode 100644 reference/pyrism/data/chg_org_solu.toml create mode 100644 reference/pyrism/data/chloro.toml create mode 100644 reference/pyrism/data/chloro_cg.toml create mode 100644 reference/pyrism/data/ethene.toml create mode 100644 reference/pyrism/data/gillan_test.toml create mode 100644 reference/pyrism/data/nhexylbenzene.toml create mode 100644 reference/pyrism/data/nitromethane_resp.toml create mode 100644 reference/pyrism/data/nitromethane_resp_wat.toml create mode 100644 reference/pyrism/data/org_solv.toml create mode 100644 reference/pyrism/data/rust_test.toml create mode 100644 reference/pyrism/plotter.py create mode 100644 reference/pyrism/rism_ctrl.py create mode 100644 reference/pyrism/tests/__init__.py create mode 100644 reference/pyrism/tests/inputs/24dimepen.toml create mode 100644 reference/pyrism/tests/inputs/2_propanol.toml create mode 100644 reference/pyrism/tests/inputs/HR1982_Br2_IV.toml create mode 100644 reference/pyrism/tests/inputs/argon_uv.toml create mode 100644 reference/pyrism/tests/inputs/cSPCE.toml create mode 100644 reference/pyrism/tests/inputs/cSPCE_NaCl.toml create mode 100644 reference/pyrism/tests/inputs/chloro.toml create mode 100644 reference/pyrism/tests/inputs/chloro_cg.toml create mode 100644 reference/pyrism/tests/inputs/nhexylbenzene.toml create mode 100644 reference/pyrism/tests/sfed_fft.py create mode 100644 reference/pyrism/tests/test_calculations.py create mode 100644 reference/pyrism/tests/test_thermo.py diff --git a/reference/pyrism/Closures/__init__.py b/reference/pyrism/Closures/__init__.py new file mode 100644 index 00000000..e3c695c8 --- /dev/null +++ b/reference/pyrism/Closures/__init__.py @@ -0,0 +1 @@ +from .closure_dispatcher import Closure diff --git a/reference/pyrism/Closures/closure_dispatcher.py b/reference/pyrism/Closures/closure_dispatcher.py new file mode 100644 index 00000000..ed9f1bcb --- /dev/null +++ b/reference/pyrism/Closures/closure_dispatcher.py @@ -0,0 +1,22 @@ +import numpy as np +from .closure_routines import * + + +class Closure(object): + closure_dispatcher = { + "HNC": HyperNetted_Chain, + "KH": KovalenkoHirata, + "PSE-1": PSE_1, + "PSE-2": PSE_2, + "PSE-3": PSE_3, + "PY": PercusYevick, + "rHNC": renormalized_HyperNetted_Chain, + "rPY": renormalized_PercusYevick, + "rKH": renormalized_KovalenkoHirata, + } + + def __init__(self, clos): + self.closure = clos + + def get_closure(self): + return self.closure_dispatcher[self.closure] diff --git a/reference/pyrism/Closures/closure_object.py b/reference/pyrism/Closures/closure_object.py new file mode 100644 index 00000000..91a47a0e --- /dev/null +++ b/reference/pyrism/Closures/closure_object.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +from pyrism.Core import RISM_Obj +import numpy as np +from dataclasses import dataclass, field + + +@dataclass +class ClosureObject: + dat_vv: RISM_Obj + dat_uv: RISM_Obj = None + + def compute_GF(self, p, energy_unit): + if self.dat_uv is not None: + return self.__GF_impl( + self.dat_uv.t, + self.dat_uv.h, + self.dat_uv.c, + self.dat_uv.B, + self.dat_uv.T, + self.dat_uv.grid.ri, + self.dat_uv.grid.d_r, + p, + energy_unit, + ) + else: + raise RuntimeError( + "No free energy functional for solvent-solvent interactions implemented." + ) + + def __GF_impl(self, t, h, c, B, T, r, dr, p, energy_unit): + mu = ( + 4.0 + * np.pi + * p + * dr + * np.sum(np.power(r, 2)[:, None, None] * ((0.5 * c * h) - c)) + ) + return mu / B * energy_unit diff --git a/reference/pyrism/Closures/closure_routines.py b/reference/pyrism/Closures/closure_routines.py new file mode 100644 index 00000000..8108f507 --- /dev/null +++ b/reference/pyrism/Closures/closure_routines.py @@ -0,0 +1,69 @@ +import numpy as np +from pyrism.Core import RISM_Obj + + +def renormalized_HyperNetted_Chain(data): + return ( + np.exp(-(data.B * data.u_sr) + data.tau + data.Q_r) - 1.0 - data.tau - data.Q_r + ) + + +def renormalized_PercusYevick(data): + return ( + np.exp(-(data.B * data.u_sr + data.Q_r)) * (1.0 + data.tau) + - data.tau + - 1.0 + - data.Q_r + ) + + +def renormalized_KovalenkoHirata(data): + return np.where( + (-(data.B * data.u_sr) + data.tau + data.Q_r) <= 0, + np.exp(-(data.B * data.u_sr) + data.tau + data.Q_r) - 1.0 - data.tau - data.Q_r, + -(data.B * data.u_sr + data.tau + data.Q_r) - data.tau - data.Q_r, + ) + + +def HyperNetted_Chain(data): + return np.exp(-(data.B * data.u_sr) + data.t) - 1.0 - data.t + + +def KovalenkoHirata(data): + return np.where( + (-(data.B * data.u_sr) + data.t) <= 0, + np.exp(-(data.B * data.u_sr) + data.t) - 1.0 - data.t, + -(data.B * data.u_sr), + ) + + +def KobrynGusarovKovalenko(data): + zeros = np.zeros_like(data.t) + return np.maximum(zeros, -(data.B * data.u_sr)) + + +def PercusYevick(data): + return np.exp(-(data.B * data.u_sr)) * (1.0 + data.t) - data.t - 1.0 + + +def PSE_n(data, n): + t_fac = 0 + for i in range(n): + t_fac += np.power((-(data.B * data.u_sr) + data.t), i) / np.math.factorial(i) + return np.where( + (-(data.B * data.u_sr) + data.t) <= 0, + np.exp(-(data.B * data.u_sr) + data.t) - 1.0 - data.t, + t_fac - 1.0 - data.t, + ) + + +def PSE_1(data): + return PSE_n(data, 1) + + +def PSE_2(data): + return PSE_n(data, 2) + + +def PSE_3(data): + return PSE_n(data, 3) diff --git a/reference/pyrism/Core/Data.py b/reference/pyrism/Core/Data.py new file mode 100644 index 00000000..69c02d57 --- /dev/null +++ b/reference/pyrism/Core/Data.py @@ -0,0 +1,97 @@ +from dataclasses import dataclass, field +import numpy as np +from .Grid import Grid +from .Site import Site +from .Species import Species + + +@dataclass +class RISM_Obj(object): + # Initial parameters required to instantiate the other attributes + T: float + kT: float + kU: float + amph: float + ns1: int + ns2: int + nsp1: int + nsp2: int + npts: int + radius: float + nlam: int + + # Set of attributes that are iterated during the RISM calculation + c: np.ndarray = field(init=False) + c_prev: np.ndarray = field(init=False) + t: np.ndarray = field(init=False) + h: np.ndarray = field(init=False) + g: np.ndarray = field(init=False) + h_k: np.ndarray = field(init=False) + + # Set of attributes that remain constant during the RISM calculation + B: float = field(init=False) + u: np.ndarray = field(init=False) + u_sr: np.ndarray = field(init=False) + ur_lr: np.ndarray = field(init=False) + uk_lr: np.ndarray = field(init=False) + w: np.ndarray = field(init=False) + p: np.ndarray = field(init=False) + grid: Grid = field(init=False) + species: list = field(init=False, default_factory=list) + atoms: list = field(init=False, default_factory=list) + Q_r: np.ndarray = field(init=False) # XRISM-DB + Q_k: np.ndarray = field(init=False) # XRISM-DB + tau: np.ndarray = field(init=False) # XRISM-DB + + def calculate_beta(self): + self.B = 1 / self.T / self.kT + + def __post_init__(self): + self.calculate_beta() + self.c_prev = np.zeros((self.npts, self.ns1, self.ns2), dtype=np.float64) + self.t = np.zeros((self.npts, self.ns1, self.ns2), dtype=np.float64) + self.h = np.zeros((self.npts, self.ns1, self.ns2), dtype=np.float64) + self.h_k = np.zeros_like(self.h) + self.Q_k = np.zeros_like(self.h) + self.Q_r = np.zeros_like(self.h) + self.tau = np.zeros_like(self.h) + self.u = np.zeros((self.npts, self.ns1, self.ns2), dtype=np.float64) + self.u_sr = np.zeros_like(self.u) + self.ur_lr = np.zeros_like(self.u) + self.uk_lr = np.zeros_like(self.u) + self.c = np.zeros((self.npts, self.ns1, self.ns2), dtype=np.float64) + self.w = np.zeros((self.npts, self.ns1, self.ns1), dtype=np.float64) + self.g = np.zeros((self.npts, self.ns1, self.ns2), dtype=np.float64) + self.p = np.zeros((self.ns1, self.ns2), dtype=np.float64) + self.grid = Grid(self.npts, self.radius) + + def __iter__(self): + return iter( + ( + self.T, + self.kT, + self.kU, + self.amph, + self.ns1, + self.ns2, + self.nsp1, + self.nsp2, + self.npts, + self.radius, + self.nlam, + self.c, + self.t, + self.h, + self.h_k, + self.g, + self.B, + self.u, + self.u_sr, + self.ur_lr, + self.uk_lr, + self.w, + self.p, + self.grid.ri, + self.grid.ki, + ) + ) diff --git a/reference/pyrism/Core/Grid.py b/reference/pyrism/Core/Grid.py new file mode 100644 index 00000000..708a3302 --- /dev/null +++ b/reference/pyrism/Core/Grid.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +""" +grid.py +Defines Grid object to handle generation and transforms + +""" +from dataclasses import dataclass, field +import numpy as np +from scipy.fftpack import dst, idst +from .Transforms import discrete_hankel_transform, inverse_discrete_hankel_transform + + +@dataclass(init=True) +class Grid: + npts: int + radius: float + ri: np.ndarray = field(init=False) + ki: np.ndarray = field(init=False) + d_r: float = field(init=False) + d_k: float = field(init=False) + + def __post_init__(self): + self.ri = np.zeros(self.npts, dtype=float) + self.ki = np.zeros(self.npts, dtype=float) + self.d_r = self.radius / float(self.npts) + self.d_k = 2 * np.pi / (2 * float(self.npts) * self.d_r) + self.generate_grid() + + def generate_grid(self): + """ + Generates r-space and k-space grids to compute functions over + + Parameters + ---------- + + Returns + ------- + + ri: ndarray + r-space grid + ki: ndarry + k-space grid + """ + + for i in np.arange(0, int(self.npts)): + self.ri[i] = (i + 0.5) * self.d_r + self.ki[i] = (i + 0.5) * self.d_k + + def dht(self, fr: np.ndarray) -> np.ndarray: + """ + Discrete Hankel Transform + + Parameters + ---------- + + fr: ndarray + Function to be transformed from r-space to k-space + + Returns + ------- + + fk: ndarray + Transformed function from r-space to k-space + """ + return discrete_hankel_transform(self.ri, self.ki, fr, self.d_r) + + def idht(self, fk: np.ndarray) -> np.ndarray: + """ + Inverse Discrete Hankel Transform + + Parameters + ---------- + + fk: ndarray + Function to be transformed from k-space to r-space + + Returns + ------- + + fr: ndarray + Transformed function from k-space to r-space + """ + return inverse_discrete_hankel_transform(self.ri, self.ki, fk, self.d_k) diff --git a/reference/pyrism/Core/Site.py b/reference/pyrism/Core/Site.py new file mode 100644 index 00000000..465d6fc3 --- /dev/null +++ b/reference/pyrism/Core/Site.py @@ -0,0 +1,9 @@ +import numpy as np +from dataclasses import dataclass, field + + +@dataclass +class Site(object): + atom_type: str + params: list + coords: np.ndarray diff --git a/reference/pyrism/Core/Species.py b/reference/pyrism/Core/Species.py new file mode 100644 index 00000000..84c32259 --- /dev/null +++ b/reference/pyrism/Core/Species.py @@ -0,0 +1,19 @@ +import numpy as np +from dataclasses import dataclass, field + + +@dataclass +class Species(object): + species_name: str + dens: float = field(init=False) + ns: int = field(init=False) + atom_sites: list = field(default_factory=list) + + def add_site(self, atom_site): + self.atom_sites.append(atom_site) + + def set_density(self, density): + self.dens = density + + def set_numsites(self, ns): + self.ns = ns diff --git a/reference/pyrism/Core/Transforms.py b/reference/pyrism/Core/Transforms.py new file mode 100644 index 00000000..427b40f8 --- /dev/null +++ b/reference/pyrism/Core/Transforms.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +""" +transforms.py + +Implementation of the forward and backward fourier-bessel +transforms (Hankel transform) using the discrete sine transform function via scipy. + +""" + +import numpy as np +from scipy.fftpack import dstn, idst +from numba import njit, jit + + +def discrete_hankel_transform( + r: np.ndarray, k: np.ndarray, fr: np.ndarray, d_r: float +) -> np.ndarray: + """ + Discrete Hankel Transform + + Parameters + ---------- + + r: ndarray + Grid to be used over r-space + + k: ndarray + Grid to be used over k-space + + fr: ndarray + Function to be transformed from r-space to k-space + + d_r: float + Grid spacing of r-space + + returns + ------- + + fk: ndarray + Transformed function from r-space to k-space + """ + constant = 2 * np.pi * d_r / k[:, np.newaxis, np.newaxis] + return constant * dstn(fr * r[:, np.newaxis, np.newaxis], type=4, axes=0) + + +def inverse_discrete_hankel_transform( + r: np.ndarray, k: np.ndarray, fk: np.ndarray, d_k: float +) -> np.ndarray: + """ + Inverse Discrete Hankel Transform + + Parameters + ---------- + + r: ndarray + Grid to be used over r-space + + k: ndarray + Grid to be used over k-space + + fk: ndarray + Function to be transformed from k-space to r-space + + d_k: float + Grid spacing of k-space + + returns + ------- + + fr: ndarray + Transformed function from k-space to r-space + """ + constant = d_k / (4 * np.pi * np.pi) / r[:, np.newaxis, np.newaxis] + return constant * dstn(fk * k[:, np.newaxis, np.newaxis], type=4, axes=0) diff --git a/reference/pyrism/Core/__init__.py b/reference/pyrism/Core/__init__.py new file mode 100644 index 00000000..ba10592e --- /dev/null +++ b/reference/pyrism/Core/__init__.py @@ -0,0 +1,5 @@ +from .Data import RISM_Obj +from .Grid import Grid +from .Site import Site +from .Transforms import * +from .Species import Species diff --git a/reference/pyrism/Functionals/__init__.py b/reference/pyrism/Functionals/__init__.py new file mode 100644 index 00000000..fb7ee3d6 --- /dev/null +++ b/reference/pyrism/Functionals/__init__.py @@ -0,0 +1 @@ +from .functional_dispatcher import Functional diff --git a/reference/pyrism/Functionals/functional_dispatcher.py b/reference/pyrism/Functionals/functional_dispatcher.py new file mode 100644 index 00000000..224803a7 --- /dev/null +++ b/reference/pyrism/Functionals/functional_dispatcher.py @@ -0,0 +1,18 @@ +from .functional_routines import * + + +class Functional(object): + functional_dispatcher = { + "GF": Gaussian_Fluctuations, + "HNC": HyperNetted_Chain, + "KH": Kovalenko_Hirata, + "SC": Single_Component, + "PW": Partial_Wave, + # "RBC": Repulsive_Bridge_Correction, + } + + def __init__(self, SFE): + self.SFE = SFE + + def get_functional(self): + return self.functional_dispatcher[self.SFE] diff --git a/reference/pyrism/Functionals/functional_routines.py b/reference/pyrism/Functionals/functional_routines.py new file mode 100644 index 00000000..336f004a --- /dev/null +++ b/reference/pyrism/Functionals/functional_routines.py @@ -0,0 +1,122 @@ +import numpy as np +import matplotlib.pyplot as plt +from pyrism.Core import RISM_Obj + + +def Gaussian_Fluctuations(data, vv=None): + mu = ( + -4.0 + * np.pi + * ( + np.power(data.grid.ri, 2)[:, np.newaxis, np.newaxis] + * ((0.5 * data.c * data.h) + data.c) + @ data.p[np.newaxis, ...] + ) + ) + return np.sum(mu, axis=(1, 2)) / data.B * data.kU + + +def HyperNetted_Chain(data, vv=None): + mu = ( + 4.0 + * np.pi + * ( + np.power(data.grid.ri, 2)[:, np.newaxis, np.newaxis] + * ((0.5 * data.t * data.h) - data.c) + @ data.p[np.newaxis, ...] + ) + ) + return np.sum(mu, axis=(1, 2)) / data.B * data.kU + + +def Kovalenko_Hirata(data, vv=None): + mu = ( + 4.0 + * np.pi + * ( + np.power(data.grid.ri, 2)[:, np.newaxis, np.newaxis] + * ( + 0.5 * np.power(data.h, 2) * np.heaviside(-data.h, 1) + - (0.5 * data.h * data.c) + - data.c + ) + @ data.p[np.newaxis, ...] + ) + ) + return np.sum(mu, axis=(1, 2)) / data.B * data.kU + + +def Single_Component(data, vv=None): + mu = ( + 4.0 + * np.pi + * ( + np.power(data.grid.ri, 2)[:, np.newaxis, np.newaxis] + * data.c + @ data.p[np.newaxis, ...] + ) + ) + + return np.sum(mu, axis=(1, 2)) / data.B * data.kU + + +def Partial_Wave(data, vv=None): + h_uv_k = data.h_k + h_bar_uv_k = np.zeros_like(h_uv_k) + + h_bar_uv_k = np.linalg.inv(data.w) @ h_uv_k @ np.linalg.inv(vv.w) @ vv.p + + h_bar_uv_r = np.zeros_like(h_bar_uv_k) + + h_bar_uv_r = data.grid.idht(h_bar_uv_k) + + mu = ( + -4.0 + * np.pi + * ( + np.power(data.grid.ri, 2)[:, np.newaxis, np.newaxis] + * (data.c + (0.5 * data.c * data.h) - (0.5 * h_bar_uv_r * data.h)) + @ data.p[np.newaxis, ...] + ) + ) + + return np.sum(mu, axis=(1, 2)) / data.B * data.kU + + +""" +def Repulsive_Bridge_Correction(data, vv=None): + u_repulsive = np.zeros_like(data.u) + + for i, iat in enumerate(data.atoms): + for j, jat in enumerate(vv.atoms): + eps_i, sig_i = iat.params[:-1] + eps_j, sig_j = jat.params[:-1] + if iat is jat: + u_repulsive[:, i, j] = 4.0 * eps_i * np.power(( sig_i / data.grid.ri ), 12) + else: + mixed_eps = np.sqrt(eps_i * eps_j) + mixed_sig = 0.5 * (sig_i + sig_j) + u_repulsive[:, i, j] = 4.0 * mixed_eps * np.power(( mixed_sig / data.grid.ri ), 12) + + v_repulsive = -data.B * u_repulsive + + expBr = np.ones_like(u_repulsive) + + v_k = np.zeros_like(u_repulsive) + + v_k = data.grid.dht(np.exp(v_repulsive)-1) + + expBr *= data.grid.idht(vv.w * v_k)+1 + + #correction for truncation error + expBr[expBr < 1e-12] = 1e-12 + + #correction for finite domain (see RISM-MOL implementation) + N_end = int(data.grid.npts - (data.grid.npts/4)) + + expBr[N_end:, ...] = 1 + + mu = 4.0 * np.pi * (np.power(data.grid.ri, 2)[:, np.newaxis, np.newaxis] * ((data.h + 1) * (expBr - 1)) @ data.p[np.newaxis, ...]) + + return np.sum(mu, axis=(1, 2)) / data.B * data.kU +""" diff --git a/reference/pyrism/IntegralEquations/DRISM.py b/reference/pyrism/IntegralEquations/DRISM.py new file mode 100644 index 00000000..44f1a54e --- /dev/null +++ b/reference/pyrism/IntegralEquations/DRISM.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 + +import numpy as np +from pyrism.Core import RISM_Obj +from dataclasses import dataclass, field +from pyrism import Util +from scipy.special import spherical_jn +from numba import njit, prange +import matplotlib.pyplot as plt + + +@dataclass +class DRISM(object): + data_vv: RISM_Obj + diel: float + adbcor: float + data_uv: RISM_Obj = None + chi: np.ndarray = field(init=False) + wbar: np.ndarray = field(init=False) + h_c0: float = field(init=False) + y: float = field(init=False) + kappa: float = field(init=False) + + def compute_vv(self): + ck = np.zeros( + (self.data_vv.npts, self.data_vv.ns1, self.data_vv.ns2), dtype=np.float64 + ) + + r = self.data_vv.grid.ri + k = self.data_vv.grid.ki + ck = self.data_vv.grid.dht(self.data_vv.c) + + self.data_vv.h = vv_impl( + self.data_vv.ns1, + self.data_vv.ns2, + self.data_vv.npts, + ck, + self.data_vv.B, + self.data_vv.uk_lr, + self.data_vv.w, + self.data_vv.p, + self.chi, + ) + self.data_vv.t = ( + self.data_vv.grid.idht(self.data_vv.h - ck) + - self.data_vv.B * self.data_vv.ur_lr + ) + + self.data_vv.h_k = self.data_vv.h + + def compute_uv(self): + if self.data_uv is not None: + ck_uv = np.zeros( + (self.data_uv.npts, self.data_uv.ns1, self.data_uv.ns2), + dtype=np.float64, + ) + + r = self.data_vv.grid.ri + ck_uv = self.data_uv.grid.dht(self.data_uv.c) + + self.data_uv.h = uv_impl( + self.data_uv.ns1, + self.data_uv.ns2, + self.data_uv.npts, + ck_uv, + self.data_uv.B, + self.data_uv.uk_lr, + self.data_uv.w, + self.data_vv.w, + self.data_uv.p, + self.data_vv.h_k, + ) + + self.data_uv.t = ( + self.data_uv.grid.idht(self.data_uv.h - ck_uv) + - self.data_uv.B * self.data_uv.ur_lr + ) + + self.data_uv.h_k = self.data_uv.h + + else: + raise RuntimeError("uv dataclass not defined") + """ + if self.data_uv is not None: + I = np.eye(self.data_uv.ns1, M=self.data_uv.ns2) + ck_uv = np.zeros((self.data_uv.npts, self.data_uv.ns1, self.data_uv.ns2), dtype=np.float64) + for i, j in np.ndindex(self.data_uv.ns1, self.data_uv.ns2): + ck_uv[:, i, j] = self.data_uv.grid.dht(self.data_uv.c[:, i, j]) + ck_uv[:, i, j] -= self.data_uv.B * self.data_uv.uk_lr[:, i, j] + for i in range(self.data_uv.grid.npts): + self.data_uv.h[i] = (self.data_uv.w[i] @ ck_uv[i]) @ (self.data_vv.w[i] + self.data_vv.p @ self.data_vv.h[i]) + for i, j in np.ndindex(self.data_uv.ns1, self.data_uv.ns2): + self.data_uv.t[:, i, j] = self.data_uv.grid.idht(self.data_uv.h[:, i, j] - ck_uv[:, i, j]) - ( + self.data_uv.B * self.data_uv.ur_lr[:, i, j]) + else: + raise RuntimeError("uv dataclass not defined") + """ + + def calculate_DRISM_params(self): + total_density = 0 + dmdensity = 0 + kap_denom = 0 + self.kappa = 0 + Util.align_dipole(self.data_vv) + dm, _ = Util.total_moment(self.data_vv) + for isp in self.data_vv.species: + total_density += isp.dens + dmdensity += isp.dens * dm * dm + qsp = 0 + _, dmvec = Util.dipole_moment(isp) + print(dmvec) + for iat in isp.atom_sites: + qsp += iat.params[-1] + kap_denom += isp.dens * 1.0 * qsp**2 + self.kappa = np.sqrt(4.0 * np.pi * kap_denom / self.diel) + ptxv = self.data_vv.species[0].dens / total_density + self.y = 4.0 * np.pi * dmdensity / 9.0 + self.h_c0 = (((self.diel - 1.0) / self.y) - 3.0) / (total_density) + + def D_matrix(self): + d0x = np.zeros((self.data_vv.ns1), dtype=np.float64) + d0y = np.zeros((self.data_vv.ns1), dtype=np.float64) + d1z = np.zeros((self.data_vv.ns1), dtype=np.float64) + for ki, k in enumerate(self.data_vv.grid.ki): + hck = self.h_c0 * np.exp(-np.power((self.adbcor * k / 2.0), 2.0)) + i = 0 + for isp in self.data_vv.species: + for iat in isp.atom_sites: + if ki == 16383: + print("final: {}\n\t{}\n\t{}".format(iat.atom_type, k * iat.coords, iat.coords)) + k_coord = k * iat.coords + if k_coord[0] == 0.0: + d0x[i] = 1.0 + else: + d0x[i] = Util.j0(k_coord[0]) + if k_coord[1] == 0.0: + d0y[i] = 1.0 + else: + d0y[i] = Util.j0(k_coord[1]) + if k_coord[2] == 0.0: + d1z[i] = 0.0 + else: + d1z[i] = Util.j1(k_coord[2]) + i += 1 + for i, j in np.ndindex((self.data_vv.ns1, self.data_vv.ns2)): + self.chi[ki, i, j] = ( + d0x[i] * d0y[i] * d1z[i] * d0x[j] * d0y[j] * d1z[j] * hck + ) + print(self.y, self.h_c0) + print(d0x) + print(d0y) + print(d1z) + + def __post_init__(self): + self.calculate_DRISM_params() + self.chi = np.zeros( + (self.data_vv.grid.npts, self.data_vv.ns1, self.data_vv.ns2), + dtype=np.float64, + ) + self.D_matrix() + + +@njit(parallel=True) +def vv_impl(ns1, ns2, npts, ck, B, uk_lr, w, p, chi): + I = np.eye(ns1, M=ns2, dtype=np.float64) + w_bar = np.zeros((npts, ns1, ns2), dtype=np.float64) + h = np.zeros_like(w_bar) + ck -= B * uk_lr + for i in prange(npts): + w_bar[i] = w[i] + p @ chi[i] + iwcp = np.linalg.inv(I - w_bar[i] @ ck[i] @ p) + wcw = w_bar[i] @ ck[i] @ w_bar[i] + h[i] = (iwcp @ wcw) + chi[i] + + return h + + +@njit(parallel=True) +def uv_impl(ns1, ns2, npts, ck_uv, B, uk_lr, w_uv, w_vv, p, h_vv): + I = np.eye(ns1, M=ns2) + h_uv = np.zeros((npts, ns1, ns2), dtype=np.float64) + + ck_uv -= B * uk_lr + for i in prange(npts): + h_uv[i] = (w_uv[i] @ ck_uv[i]) @ (w_vv[i] + p @ h_vv[i]) + + return h_uv diff --git a/reference/pyrism/IntegralEquations/IE.py b/reference/pyrism/IntegralEquations/IE.py new file mode 100644 index 00000000..bba82d36 --- /dev/null +++ b/reference/pyrism/IntegralEquations/IE.py @@ -0,0 +1,18 @@ +import numpy as np +from .XRISM import XRISM +from .DRISM import DRISM +from .XRISM_DB import XRISM_DB + + +class IntegralEquation(object): + IE_dispatcher = { + "XRISM": XRISM, + "DRISM": DRISM, + "XRISM-DB": XRISM_DB, + } + + def __init__(self, IE): + self.IE = IE + + def get_IE(self): + return self.IE_dispatcher[self.IE] diff --git a/reference/pyrism/IntegralEquations/XRISM.py b/reference/pyrism/IntegralEquations/XRISM.py new file mode 100644 index 00000000..2627a1d0 --- /dev/null +++ b/reference/pyrism/IntegralEquations/XRISM.py @@ -0,0 +1,109 @@ +import numpy as np +from pyrism import Util +from pyrism.Core import RISM_Obj +from dataclasses import dataclass, field +from numba import jit, njit, prange + + +@dataclass +class XRISM(object): + data_vv: RISM_Obj + data_uv: RISM_Obj = None + + # def compute_vv(self): + + # self.data_vv.h_k, self.data_vv.t = xrism( + # self.data_vv.ns1, + # self.data_vv.npts, + # self.data_vv.grid.ri, + # self.data_vv.grid.ki, + # self.data_vv.grid.d_r, + # self.data_vv.grid.d_k, + # self.data_vv.c, + # self.data_vv.w, + # self.data_vv.p, + # self.data_vv.B, + # self.data_vv.uk_lr, + # self.data_vv.ur_lr + # ) + + def compute_vv(self): + ck = np.zeros( + (self.data_vv.npts, self.data_vv.ns1, self.data_vv.ns2), dtype=np.float64 + ) + + ck = self.data_vv.grid.dht(self.data_vv.c) + + self.data_vv.h = vv_impl( + self.data_vv.ns1, + self.data_vv.ns2, + self.data_vv.npts, + ck, + self.data_vv.B, + self.data_vv.uk_lr, + self.data_vv.w, + self.data_vv.p, + ) + + self.data_vv.t = ( + self.data_vv.grid.idht(self.data_vv.h - ck) + - self.data_vv.B * self.data_vv.ur_lr + ) + + self.data_vv.h_k = self.data_vv.h + + def compute_uv(self): + if self.data_uv is not None: + ck_uv = np.zeros( + (self.data_uv.npts, self.data_uv.ns1, self.data_uv.ns2), + dtype=np.float64, + ) + + ck_uv = self.data_uv.grid.dht(self.data_uv.c) + + self.data_uv.h = uv_impl( + self.data_uv.ns1, + self.data_uv.ns2, + self.data_uv.npts, + ck_uv, + self.data_uv.B, + self.data_uv.uk_lr, + self.data_uv.w, + self.data_vv.w, + self.data_uv.p, + self.data_vv.h, + ) + + self.data_uv.t = ( + self.data_uv.grid.idht(self.data_uv.h - ck_uv) + - self.data_uv.B * self.data_uv.ur_lr + ) + + self.data_uv.h_k = self.data_uv.h + else: + raise RuntimeError("uv dataclass not defined") + + +@njit(parallel=True) +def vv_impl(ns1, ns2, npts, ck, B, uk_lr, w, p): + I = np.eye(ns1, M=ns2) + h = np.zeros((npts, ns1, ns2), dtype=np.float64) + ck -= B * uk_lr + for i in prange(npts): + iwcp = np.linalg.inv(I - w[i] @ ck[i] @ p) + wcw = w[i] @ ck[i] @ w[i] + h[i] = iwcp @ wcw + + return h + + +@njit(parallel=True) +def uv_impl(ns1, ns2, npts, ck_uv, B, uk_lr, w_uv, w_vv, p, h_vv): + I = np.eye(ns1, M=ns2) + h_uv = np.zeros((npts, ns1, ns2), dtype=np.float64) + + ck_uv -= B * uk_lr + for i in prange(npts): + h_uv[i] = (w_uv[i] @ ck_uv[i]) @ (w_vv[i] + p @ h_vv[i]) + + return h_uv diff --git a/reference/pyrism/IntegralEquations/XRISM_DB.py b/reference/pyrism/IntegralEquations/XRISM_DB.py new file mode 100644 index 00000000..a14df5f4 --- /dev/null +++ b/reference/pyrism/IntegralEquations/XRISM_DB.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 + +import numpy as np +from pyrism.Core import RISM_Obj +from dataclasses import dataclass, field +from numba import jit, njit, prange + + +@dataclass +class XRISM_DB(object): + eps: float = field(init=False) + b_param: float + data_vv: RISM_Obj + data_uv: RISM_Obj = None + + def _pot_builder(self, dat1, dat2): + for i, iat in enumerate(dat1.atoms): + for j, jat in enumerate(dat2.atoms): + i_sr_params = iat.params[:-1] + j_sr_params = jat.params[:-1] + qi = iat.params[-1] + qj = jat.params[-1] + dat1.ur_lr[:, i, j] = self._coulomb_r(dat2.grid.ri, qi, qj, dat2.amph) + dat1.uk_lr[:, i, j] = self._coulomb_k(dat2.grid.ki, qi, qj, dat2.amph) + + def _coulomb_r(self, r, q1, q2, charge_coeff): + return charge_coeff * q1 * q2 / r + + def _coulomb_k(self, k, q1, q2, charge_coeff): + return charge_coeff * 4.0 * np.pi * q1 * q2 / np.power(k, 2) + + def construct_Q(self, dat1): + I = np.eye(dat1.ns1, M=dat1.ns2) + u = -dat1.B * dat1.uk_lr + for i in range(dat1.grid.npts): + wu = dat1.w[i] @ u[i] @ dat1.w[i] + iwu = np.linalg.inv(I - dat1.w[i] @ u[i]) + dat1.Q_k[i] = wu @ iwu @ dat1.w[i] + + def mu_sq(self, dat1): + mu = 0.0 + for isp in dat1.species: + for iat in isp.atom_sites: + mu += isp.dens * iat.params[-1] * iat.params[-1] + return 4.0 * np.pi * dat1.B * mu + + def compute_vv(self): + ur_lr = -self.data_vv.B * self.data_vv.ur_lr + uk_lr = -self.data_vv.B * self.data_vv.uk_lr + + self._pot_builder(self.data_vv, self.data_vv) + self.data_vv.u_sr = self.data_vv.u - self.data_vv.ur_lr + self.construct_Q(self.data_vv) + mu_sq = self.mu_sq(self.data_vv) + + Q_lr_k = uk_lr / ( + 1.0 + (mu_sq / np.power(self.data_vv.grid.ki[:, np.newaxis, np.newaxis], 2)) + ) + + Q_lr_r = ur_lr * np.exp( + -np.sqrt(mu_sq) * self.data_vv.grid.ri[:, np.newaxis, np.newaxis] + ) + + for i, j in np.ndindex(self.data_vv.ns1, self.data_vv.ns2): + self.data_vv.Q_r[..., i, j] = ( + self.data_vv.grid.idht(self.data_vv.Q_k[..., i, j] - Q_lr_k[..., i, j]) + + Q_lr_r[..., i, j] + ) + # self.data_vv.Q_r[..., i, j] = self.data_vv.grid.idht(self.data_vv.Q_k[..., i, j]) + + ck = np.zeros( + (self.data_vv.npts, self.data_vv.ns1, self.data_vv.ns2), dtype=np.float64 + ) + + for i, j in np.ndindex(self.data_vv.ns1, self.data_vv.ns2): + ck[..., i, j] = self.data_vv.grid.dht(self.data_vv.c[..., i, j]) + + self.data_vv.h = vv_impl( + self.data_vv.ns1, + self.data_vv.ns2, + self.data_vv.npts, + ck, + self.data_vv.B, + self.data_vv.uk_lr, + self.data_vv.w, + self.data_vv.p, + self.data_vv.Q_k, + ) + + for i, j in np.ndindex(self.data_vv.ns1, self.data_vv.ns2): + self.data_vv.t[:, i, j] = self.data_vv.grid.idht( + self.data_vv.h[:, i, j] - ck[:, i, j] + ) + self.data_vv.tau = self.data_vv.t - self.data_vv.Q_r + ur_lr + + def compute_uv(self): + if self.data_uv is not None: + ck_uv = np.zeros( + (self.data_uv.npts, self.data_uv.ns1, self.data_uv.ns2), + dtype=np.float64, + ) + + for i, j in np.ndindex(self.data_uv.ns1, self.data_uv.ns2): + ck_uv[..., i, j] = self.data_uv.grid.dht(self.data_uv.c[..., i, j]) + + self.data_uv.h = uv_impl( + self.data_uv.ns1, + self.data_uv.ns2, + self.data_uv.npts, + ck_uv, + self.data_uv.B, + self.data_uv.uk_lr, + self.data_uv.w, + self.data_vv.w, + self.data_uv.p, + self.data_vv.h, + ) + + for i, j in np.ndindex(self.data_uv.ns1, self.data_uv.ns2): + self.data_uv.t[:, i, j] = ( + self.data_uv.grid.idht(self.data_uv.h[:, i, j] - ck_uv[:, i, j]) + - self.data_uv.B * self.data_uv.ur_lr[:, i, j] + ) + else: + raise RuntimeError("uv dataclass not defined") + + +@njit(parallel=True) +def vv_impl(ns1, ns2, npts, ck, B, uk_lr, w, p, Q): + I = np.eye(ns1, M=ns2) + h = np.zeros((npts, ns1, ns2), dtype=np.float64) + + w += Q + for i in prange(npts): + iwcp = np.linalg.inv(I - w[i] @ ck[i] @ p) + wc = w[i] @ ck[i] + h[i] = wc @ iwcp @ w[i] + + return h + Q + + +@njit(parallel=True) +def uv_impl(ns1, ns2, npts, ck_uv, B, uk_lr, w_uv, w_vv, p, h_vv): + I = np.eye(ns1, M=ns2) + h_uv = np.zeros((npts, ns1, ns2), dtype=np.float64) + + for i in prange(npts): + h_uv[i] = (w_uv[i] @ ck_uv[i]) @ (w_vv[i] + p @ h_vv[i]) + + return h_uv diff --git a/reference/pyrism/IntegralEquations/XRISM_UV.py b/reference/pyrism/IntegralEquations/XRISM_UV.py new file mode 100644 index 00000000..17bc047a --- /dev/null +++ b/reference/pyrism/IntegralEquations/XRISM_UV.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +import numpy as np +from Core import RISM_Obj + + +def XRISM_UV(data_vv, data_uv): + I = np.eye(data_uv.ns1, M=data_uv.ns2) + ck_uv = np.zeros((data_uv.npts, data_uv.ns1, data_uv.ns2), dtype=np.float64) + for i, j in np.ndindex(data_uv.ns1, data_uv.ns2): + ck_uv[:, i, j] = data_uv.grid.dht(data_uv.c[:, i, j]) + ck_uv[:, i, j] -= data_uv.B * data_uv.uk_lr[:, i, j] + for i in range(data_uv.grid.npts): + data_uv.h[i] = (data_uv.w[i] @ ck_uv[i]) @ ( + data_vv.w[i] + data_vv.p @ data_vv.h[i] + ) + for i, j in np.ndindex(data_uv.ns1, data_uv.ns2): + data_uv.t[:, i, j] = data_uv.grid.idht(data_uv.h[:, i, j] - ck_uv[:, i, j]) - ( + data_uv.B * data_uv.ur_lr[:, i, j] + ) diff --git a/reference/pyrism/IntegralEquations/XRISM_impl.py b/reference/pyrism/IntegralEquations/XRISM_impl.py new file mode 100644 index 00000000..09e02f38 --- /dev/null +++ b/reference/pyrism/IntegralEquations/XRISM_impl.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +import numpy as np + + +# pythran export vv_impl(int, int, float, float64 [], float, float64 [], float64 [], float64 []) +def vv_impl(ns1, ns2, npts, ck, B, uk_lr, w, p): + I = np.eye(ns1, M=ns2) + h = np.zeros((npts, ns1, ns2), dtype=np.float64) + + ck -= B * uk_lr + for i in range(npts): + iwcp = np.linalg.inv(I - w[i] @ ck[i] @ p) + wcw = w[i] @ ck[i] @ w[i] + h[i] = iwcp @ wcw + + return h diff --git a/reference/pyrism/IntegralEquations/__init__.py b/reference/pyrism/IntegralEquations/__init__.py new file mode 100644 index 00000000..8ff359a4 --- /dev/null +++ b/reference/pyrism/IntegralEquations/__init__.py @@ -0,0 +1 @@ +from .IE import IntegralEquation diff --git a/reference/pyrism/Potentials/#mixing.py# b/reference/pyrism/Potentials/#mixing.py# new file mode 100644 index 00000000..d60d33a1 --- /dev/null +++ b/reference/pyrism/Potentials/#mixing.py# @@ -0,0 +1,49 @@ +import numpy as np + + +def geometric_mean(A: float, B: float) -> float: + return np.sqrt(A * B) + + +def arithmetic_mean(A: float, B: float) -> float: + return 0.5 * (A + B) + + +def Lorentz_Berthelot(params1, params2) -> tuple: + """ + Lorentz-Berthelot mixing rules to compute epsilon and sigma parameters of different site types + + Parameters + ---------- + + eps1 : float + epsilon parameter of site 1 + + eps2 : float + epsilon parameter of site 2 + + sig1 : float + sigma parameter of site 1 + + sig2 : float + sigma parameter of site 2 + + Returns + ------- + eps : float + Mixed epsilon parameter + sig : float + Mixed sigma parameter + """ + eps1, sig1 = params1 + eps2, sig2 = params2 + eps = geometric_mean(eps1, eps2) + sig = arithmetic_mean(sig1, sig2) + return eps, sig + + +def AB_mixing(A_1: float, A_2: float, B_1: float, B_2: float) -> float: + + A = geometric_mean(A_1, A_2) + B = geometric_mean(B_1, B_2) + return A, B diff --git a/reference/pyrism/Potentials/.#mixing.py b/reference/pyrism/Potentials/.#mixing.py new file mode 120000 index 00000000..e3c501d2 --- /dev/null +++ b/reference/pyrism/Potentials/.#mixing.py @@ -0,0 +1 @@ +abdullah_ahmad@chem-3e2.chem.strath.ac.uk.671 \ No newline at end of file diff --git a/reference/pyrism/Potentials/__init__.py b/reference/pyrism/Potentials/__init__.py new file mode 100644 index 00000000..75943eb0 --- /dev/null +++ b/reference/pyrism/Potentials/__init__.py @@ -0,0 +1 @@ +from .potential_dispatcher import Potential diff --git a/reference/pyrism/Potentials/mixing.py b/reference/pyrism/Potentials/mixing.py new file mode 100644 index 00000000..d64de09a --- /dev/null +++ b/reference/pyrism/Potentials/mixing.py @@ -0,0 +1,52 @@ +import numpy as np +from numba import njit, jit + + +@njit +def geometric_mean(A: float, B: float) -> float: + return np.sqrt(A * B) + + +@njit +def arithmetic_mean(A: float, B: float) -> float: + return 0.5 * (A + B) + + +@jit +def Lorentz_Berthelot(params1, params2) -> tuple: + """ + Lorentz-Berthelot mixing rules to compute epsilon and sigma parameters of different site types + + Parameters + ---------- + + eps1 : float + epsilon parameter of site 1 + + eps2 : float + epsilon parameter of site 2 + + sig1 : float + sigma parameter of site 1 + + sig2 : float + sigma parameter of site 2 + + Returns + ------- + eps : float + Mixed epsilon parameter + sig : float + Mixed sigma parameter + """ + eps1, sig1 = params1 + eps2, sig2 = params2 + eps = geometric_mean(eps1, eps2) + sig = arithmetic_mean(sig1, sig2) + return eps, sig + + +def AB_mixing(A_1: float, A_2: float, B_1: float, B_2: float) -> float: + A = geometric_mean(A_1, A_2) + B = geometric_mean(B_1, B_2) + return A, B diff --git a/reference/pyrism/Potentials/potential_dispatcher.py b/reference/pyrism/Potentials/potential_dispatcher.py new file mode 100644 index 00000000..ad1154dd --- /dev/null +++ b/reference/pyrism/Potentials/potential_dispatcher.py @@ -0,0 +1,20 @@ +import numpy as np +from .potential_routines import * +from .mixing import * + + +class Potential: + potential_dispatcher = { + "LJ": [Lennard_Jones, Lorentz_Berthelot], + "LJ_AB": [Lennard_Jones_AB, AB_mixing], + "HS": [hard_spheres, arithmetic_mean], + "cou": [coulomb, None], + "erfr": [coulomb_lr_r, None], + "erfk": [coulomb_lr_k, None], + } + + def __init__(self, pot): + self.potential = pot + + def get_potential(self): + return self.potential_dispatcher[self.potential] diff --git a/reference/pyrism/Potentials/potential_routines.py b/reference/pyrism/Potentials/potential_routines.py new file mode 100644 index 00000000..b9570fbe --- /dev/null +++ b/reference/pyrism/Potentials/potential_routines.py @@ -0,0 +1,186 @@ +import numpy as np +from scipy.special import erf, erfc +from numba import njit + + +@njit +def Lennard_Jones(r, params, lam): + """ + Computes the Lennard-Jones potential with epsilon and sigma parameters + + Parameters + ---------- + + eps: float + Epsilon parameter used for LJ equation + sig: float + Sigma parameter used for LJ equation + grid.ri: ndarray + In the context of rism, ri corresponds to grid points upon which + RISM equations are solved + lam: float + Lambda parameter to switch on potential + + Returns + ------- + result: float + The result of the LJ computation + """ + eps, sig = params + return 4.0 * eps * ((sig / r) ** 12 - (sig / r) ** 6) * lam + + +def Lennard_Jones_AB(r, C6, C12, lam): + """ + Computes the Lennard-Jones potential with C6 and C12 parameters + + Parameters + ---------- + + C6: float + C6 parameter used for LJ equation + C12: float + C12 parameter used for LJ equation + grid.ri: ndarray + In the context of rism, ri corresponds to grid points upon which + RISM equations are solved + lam: float + Lambda parameter to switch on potential + + Returns + ------- + result: float + The result of the LJ computation + """ + + return ((C12 / r**12) - (C6 / r**6)) * lam + + +def hard_spheres(r, sigma, lam): + """ + Computes the Lennard-Jones potential with C6 and C12 parameters + + Parameters + ---------- + + C6: float + C6 parameter used for LJ equation + C12: float + C12 parameter used for LJ equation + grid.ri: ndarray + In the context of rism, ri corresponds to grid points upon which + RISM equations are solved + lam: float + Lambda parameter to switch on potential + + Returns + ------- + result: float + The result of the LJ computation + """ + + return np.where((r >= sigma), 0, np.inf) * lam + + +@njit +def coulomb(r, q1, q2, lam, charge_coeff): + """ + Computes the Coulomb potential + + Parameters + ---------- + + q1: float + Coulomb charge for particle 1 + q2: float + Coulomb charge for particle 1 + grid.ri: ndarray + In the context of rism, ri corresponds to grid points upon which + RISM equations are solved + lam: float + Lambda parameter to switch on potential + + Returns + ------- + result: float + The result of the LJ computation + """ + return lam * charge_coeff * q1 * q2 / r + + +def coulomb_lr_r(r, q1, q2, damping, rscreen, lam, charge_coeff): + """ + Computes the Ng renorm potential + + Parameters + ---------- + + q1: float + Coulomb charge for particle 1 + q2: float + Coulomb charge for particle 1 + grid.ri: ndarray + In the context of rism, ri corresponds to grid points upon which + RISM equations are solved + damping: float + Damping parameter for erf + lam: float + Lambda parameter to switch on potential + + Returns + ------- + result: float + The result of the LJ computation + """ + return lam * charge_coeff * q1 * q2 * erf(damping * r / rscreen) / r + + # return lam * charge_coeff * q1 * q2 * (1.0 - erfc( r / rscreen)) + + +@njit +def coulomb_lr_k(k, q1, q2, damping, lam, charge_coeff): + """ + Computes the Ng renorm potential + + Parameters + ---------- + + q1: float + Coulomb charge for particle 1 + q2: float + Coulomb charge for particle 1 + grid.ri: ndarray + In the context of rism, ri corresponds to grid points upon which + RISM equations are solved + damping: float + Damping parameter for erf + lam: float + Lambda parameter to switch on potential + + Returns + ------- + result: float + The result of the LJ computation + """ + """ + return ( + lam + * 4.0 + * np.pi + * q1 + * q2 + * charge_coeff + * np.exp(-np.power((damping * k / 2.0), 2.0)) + / k + ) + """ + return ( + lam + * 4.0 + * np.pi + * q1 + * q2 + * charge_coeff + * np.exp(-1.0 * k**2.0 / (4.0 * damping**2.0)) + / k**2.0 + ) diff --git a/reference/pyrism/Solvers/Gillan.py b/reference/pyrism/Solvers/Gillan.py new file mode 100644 index 00000000..12f6c0a9 --- /dev/null +++ b/reference/pyrism/Solvers/Gillan.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python + +from pyrism.Core import RISM_Obj +import numpy as np +from numpy.testing import assert_allclose +from scipy.optimize import newton_krylov +from .Solver_object import * +import matplotlib.pyplot as plt +from numba import njit, prange + + +@dataclass +class Gillan(SolverObject): + nbasis: int = field(default=4) + costab: np.ndarray = field(init=False) + + def check_symmetric(self, a, rtol=1e-05, atol=1e-08): + return np.allclose(a, a.T, rtol=rtol, atol=atol) + + def kron_delta(self, i, j): + if i == j: + return 1.0 + else: + return 0.0 + + def D(self, i): + npts = self.data_vv.grid.npts + ns1 = self.data_vv.ns1 + ns2 = self.data_vv.ns2 + dk = self.data_vv.grid.d_k + w = self.data_vv.w + ck = np.zeros_like(self.data_vv.c) + r_grid = self.data_vv.grid.ri + k_grid = self.data_vv.grid.ki + + ck = self.data_vv.grid.dht(self.data_vv.c) + + # for l in range(npts): + # M1[l] = np.linalg.inv((I - w[l] @ ck[l] @ self.data_vv.p)) @ w[l] + # M2[l] = np.linalg.inv((I - w[l] @ ck[l] @ self.data_vv.p)) @ w[l] + # coskr += np.cos(k_grid[l] * r_grid[i]) + + # for i, j in np.ndindex(ns1, ns2): + # for k, l in np.ndindex(ns1, ns2): + # kron1 = self.kron_delta(i, j) + # kron2 = self.kron_delta(k, l) + # D[:, i, j, k, l] = coskr[:] * (M1[:, i, j] * M2[:, k, l] - kron1 * kron2) + + D = D_calc(ns1, ns2, npts, w, ck, self.data_vv.p, k_grid, r_grid, i) + + return D.sum(axis=0) * dk + + def solve(self, RISM, Closure, lam, verbose=False): + npts = self.data_vv.grid.npts + ns1 = self.data_vv.ns1 + ns2 = self.data_vv.ns2 + r = self.data_vv.grid.ri + t = self.data_vv.t + node = int(npts / self.nbasis / 2) + node_index = np.arange(0, self.nbasis + 1) * node + nodes = r[node_index] + + P = np.zeros((npts, self.nbasis + 1), dtype=np.float64) + Q = np.zeros_like(P) + R = np.zeros((self.nbasis, self.nbasis), dtype=np.float64) + B = np.zeros_like(R) + A = np.zeros((ns1, ns2, self.nbasis), dtype=np.float64) + + dydc = np.zeros((npts, ns1, ns2, ns1, ns2), dtype=np.float64) + + P[..., 0] = 1 + for idx in range(0, npts): + if nodes[0] <= r[idx] <= nodes[1]: + P[idx, 1] = (nodes[1] - r[idx]) / nodes[1] + + for a in range(2, self.nbasis + 1): + for idx in range(0, npts): + if nodes[a - 2] <= r[idx] <= nodes[a - 1]: + P[idx, a] = (r[idx] - nodes[a - 2]) / (nodes[a - 1] - nodes[a - 2]) + elif nodes[a - 1] <= r[idx] <= nodes[a]: + P[idx, a] = (nodes[a] - r[idx]) / (nodes[a] - nodes[a - 1]) + + # for a in range(1, self.nbasis+1): + # plt.plot(r, P[..., a]) + # plt.show() + + P_proper = P[..., 1:].copy() + P_skip_zero = P_proper.copy() + Pa = P_proper.copy() + Pb = P_proper.copy() + + for a in range(self.nbasis): + for b in range(self.nbasis): + R[a, b] = (Pa[..., a] * Pb[..., b]).sum() + + # Checking for positive-definiteness + # print(self.check_symmetric(R)) + # print(np.linalg.eigvalsh(R)) + + B = np.linalg.inv(R) + + for i in range(npts): + for a in range(self.nbasis): + Q[i, a] = (B[a, :] * P_skip_zero[i, :]).sum() + + kron = np.zeros_like(R) + + for a in range(self.nbasis): + for b in range(self.nbasis): + kron[a, b] = (Q[..., a] * P_skip_zero[..., b]).sum() + + identity = np.identity(self.nbasis, dtype=np.float64) + assert_allclose(kron, identity, atol=1e-4, rtol=1e-4) + + for a in range(self.nbasis): + for m, n in np.ndindex(ns1, ns2): + A[m, n, a] = (Q[..., a] * t[:, m, n]).sum() + + while i < self.max_iter: + # N-R loop + while True: + break + + def solve_uv(self, RISM, Closure, lam): + pass + + +@njit +def D_calc(ns1, ns2, npts, w, ck, p, k_grid, r_grid, dk, i): + D = np.zeros((npts, ns1, ns2, ns1, ns2), dtype=np.float64) + coskr = np.zeros((npts), dtype=np.float64) + M1 = np.zeros_like(w) + M2 = np.zeros_like(w) + I = np.identity(ns1, dtype=np.float64) + + for l in prange(npts): + M1[l] = np.linalg.inv((I - w[l] @ ck[l] @ p)) @ w[l] + M2[l] = np.linalg.inv((I - w[l] @ ck[l] @ p)) @ w[l] + coskr[l] = np.cos(k_grid[l] * r_grid[i]) + + kron1, kron2 = 0.0, 0.0 + for i in prange(ns1): + for j in prange(ns2): + if i == j: + kron1 = 1.0 + else: + kron1 = 0.0 + for k in prange(ns1): + for l in prange(ns2): + if k == l: + kron2 = 1.0 + else: + kron2 = 0.0 + # print(i, j, k, l) + D[:, i, j, k, l] = coskr[:] * ( + M1[:, i, j] * M2[:, k, l] - kron1 * kron2 + ) + + return D.sum(axis=0) * dk diff --git a/reference/pyrism/Solvers/MDIIS.py b/reference/pyrism/Solvers/MDIIS.py new file mode 100644 index 00000000..8971cbe4 --- /dev/null +++ b/reference/pyrism/Solvers/MDIIS.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python3 + +from pyrism.Core import RISM_Obj +import numpy as np +from dataclasses import dataclass, field +from .Solver_object import * +from numba import njit, prange +from numba.core.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning +import warnings +import sys +import matplotlib.pyplot as plt + +warnings.simplefilter("ignore", category=NumbaDeprecationWarning) +warnings.simplefilter("ignore", category=NumbaPendingDeprecationWarning) + +np.set_printoptions( + edgeitems=30, linewidth=180, formatter=dict(float=lambda x: "%.5g" % x) +) + + +@dataclass +class MDIIS(SolverObject): + m: int = field(default=1) # depth + mdiis_damping: float = field(default=0.5) + fr: list = field(init=False, default_factory=list) + res: list = field(init=False, default_factory=list) + RMS_res: list = field(init=False, default_factory=list) + + def step_Picard(self, curr, prev): + self.fr.append(curr.flatten()) + self.res.append((curr - prev).flatten()) + return prev + self.damp_picard * (curr - prev) + + def step_MDIIS(self, curr, prev, gr): + return step_MDIIS_impl( + curr, + prev, + self.m, + self.res, + self.fr, + self.damp_picard, + self.mdiis_damping, + gr, + ) + + def solve(self, RISM, Closure, lam, verbose=False): + i: int = 0 + A = np.zeros((2, 2), dtype=np.float64) + b = np.zeros(2, dtype=np.float64) + + if verbose == True: + print("\nSolving solvent-solvent RISM equation...\n") + self.fr.clear() + self.res.clear() + self.RMS_res.clear() + while i < self.max_iter: + c_prev = self.data_vv.c + try: + RISM() + c_A = Closure(self.data_vv) + except FloatingPointError as e: + print("Possible divergence") + print("iteration: {i}".format(i=i)) + print("diff: {diff}".format(diff=(c_A - c_prev).min())) + raise e + if len(self.fr) < self.m: + c_next = self.step_Picard(c_A, c_prev) + RMS = np.sqrt( + 1 + / self.data_vv.ns1 + / self.data_vv.grid.npts + * np.power((c_A - c_prev).sum(), 2) + ) + self.RMS_res.append(RMS) + else: + c_next = self.step_MDIIS(c_A, c_prev, self.data_vv.t + c_A) + c_next = np.reshape(c_next, c_prev.shape) + RMS = np.sqrt( + 1 + / self.data_vv.ns1 + / self.data_vv.grid.npts + * np.power((c_A - c_prev).sum(), 2) + ) + if RMS > 10 * min(self.RMS_res): + print("Restarting MDIIS") + min_index = self.RMS_res.index(min(self.RMS_res)) + c_next = np.reshape(self.fr[min_index], c_prev.shape) + self.fr.clear() + self.res.clear() + self.RMS_res.clear() + self.RMS_res.append(RMS) + self.RMS_res.pop(0) + self.converged(c_next, c_prev) + print( + "Iteration: {i} Convergence RMS: {RMS}".format( + i=i, RMS=self.rms, + ) + ) + + # print(c_next) + self.data_vv.c = c_next + if self.converged(c_next, c_prev) and verbose == True: + self.epilogue(i, lam) + break + elif self.converged(c_next, c_prev): + break + + i += 1 + + if i == self.max_iter and verbose == True: + self.epilogue(i, lam) + raise RuntimeError("max iteration reached") + elif i == self.max_iter: + raise RuntimeError("max iteration reached") + + def solve_uv(self, RISM, Closure, lam, verbose=False): + i: int = 0 + A = np.zeros((2, 2), dtype=np.float64) + b = np.zeros(2, dtype=np.float64) + + if verbose == True: + print("\nSolving solute-solvent RISM equation...\n") + self.fr.clear() + self.res.clear() + self.RMS_res.clear() + + while i < self.max_iter: + c_prev = self.data_uv.c.copy() + try: + RISM() + c_A = Closure(self.data_uv) + except FloatingPointError as e: + print("Possible divergence") + print("iteration: {i}".format(i=i)) + print("diff: {diff}".format(diff=(c_A - c_prev).sum())) + raise e + if len(self.fr) < self.m: + c_next = self.step_Picard(c_A, c_prev) + RMS = np.sqrt( + 1 + / self.data_uv.ns1 + / self.data_vv.grid.npts + * np.power((c_A - c_prev).sum(), 2) + ) + self.RMS_res.append(RMS) + else: + c_next = self.step_MDIIS(c_A, c_prev, self.data_uv.t + c_A) + c_next = np.reshape(c_next, c_prev.shape) + RMS = np.sqrt( + 1 + / self.data_uv.ns1 + / self.data_uv.grid.npts + * np.power((c_A - c_prev).sum(), 2) + ) + if RMS > 10 * min(self.RMS_res): + min_index = self.RMS_res.index(min(self.RMS_res)) + c_next = np.reshape(self.fr[min_index], c_prev.shape) + self.fr.clear() + self.res.clear() + self.RMS_res.clear() + self.RMS_res.append(RMS) + self.RMS_res.pop(0) + + self.data_uv.c = c_next + + if self.converged(c_next, c_prev) and verbose == True: + self.epilogue(i, lam) + break + elif self.converged(c_next, c_prev): + break + + i += 1 + + if i == self.max_iter and verbose == True: + self.epilogue(i, lam) + raise RuntimeError("max iteration reached") + elif i == self.max_iter: + raise RuntimeError("max iteration reached") + + +@njit +def step_MDIIS_impl(curr, prev, m, res, fr, damp_picard, damp_mdiis, gr): + A = np.zeros((m + 1, m + 1), dtype=np.float64) + b = np.zeros(m + 1, dtype=np.float64) + + b[m] = -1 + + for i in prange(m + 1): + A[i, m] = -1 + A[m, i] = -1 + + A[m, m] = 0 + + for i, j in np.ndindex((m, m)): + A[i, j] = res[i] @ res[j] + + coef = np.linalg.solve(A, b) + + c_A = np.zeros_like(fr[0]) + min_res = np.zeros_like(fr[0]) + denom = np.sqrt(1.0 + np.power(gr.flatten(), 2)) + for i in prange(m): + c_A += coef[i] * fr[i] + min_res += (coef[i] * res[i]) / denom + + c_new = c_A + damp_mdiis * min_res + + fr.append(curr.flatten()) + res.append((curr - prev).flatten()) + + fr.pop(0) + res.pop(0) + + return c_new diff --git a/reference/pyrism/Solvers/Ng.py b/reference/pyrism/Solvers/Ng.py new file mode 100644 index 00000000..cd7266d4 --- /dev/null +++ b/reference/pyrism/Solvers/Ng.py @@ -0,0 +1,103 @@ +import numpy as np +from pyrism.Core import RISM_Obj +from .Solver_object import * +from dataclasses import dataclass, field +import pdb + + +@dataclass +class NgSolver(SolverObject): + fr: list = field(init=False, default_factory=list) + gr: list = field(init=False, default_factory=list) + + def step_Picard(self, curr, prev): + self.fr.append(prev) + self.gr.append(curr) + return prev + self.damp_picard * (curr - prev) + + def step_Ng(self, curr, prev, A, b): + vecdr = np.asarray(self.gr) - np.asarray(self.fr) + dn = vecdr[-1].flatten() + d01 = (vecdr[-1] - vecdr[-2]).flatten() + d02 = (vecdr[-1] - vecdr[-3]).flatten() + A[0, 0] = np.inner(d01, d01) + A[0, 1] = np.inner(d01, d02) + A[1, 0] = np.inner(d01, d02) + A[1, 1] = np.inner(d02, d02) + b[0] = np.inner(dn, d01) + b[1] = np.inner(dn, d02) + c = np.linalg.solve(A, b) + c_next = ( + (1 - c[0] - c[1]) * self.gr[-1] + c[0] * self.gr[-2] + c[1] * self.gr[-3] + ) + self.fr.append(prev) + self.gr.append(curr) + self.gr.pop(0) + self.fr.pop(0) + return c_next + + def solve(self, RISM, Closure, lam, verbose=False): + i: int = 0 + A = np.zeros((2, 2), dtype=np.float64) + b = np.zeros(2, dtype=np.float64) + if verbose == True: + print("\nSolving solvent-solvent RISM equation...\n") + while i < self.max_iter: + # self.epilogue(i, lam) + c_prev = self.data_vv.c + RISM() + c_A = Closure(self.data_vv) + if i < 3: + c_next = self.step_Picard(c_A, c_prev) + else: + c_next = self.step_Ng(c_A, c_prev, A, b) + + self.data_vv.c = c_next + + if self.converged(c_next, c_prev) and verbose == True: + self.epilogue(i, lam) + break + elif self.converged(c_next, c_prev): + break + + i += 1 + + if i == self.max_iter and verbose == True: + print("Max iteration reached!") + self.epilogue(i, lam) + break + elif i == self.max_iter: + break + + def solve_uv(self, RISM, Closure, lam, verbose=False): + i: int = 0 + A = np.zeros((2, 2), dtype=np.float64) + b = np.zeros(2, dtype=np.float64) + if verbose == True: + print("\nSolving solute-solvent RISM equation...\n") + + while i < self.max_iter: + c_prev = self.data_uv.c + RISM() + c_A = Closure(self.data_uv) + if i < 3: + c_next = self.step_Picard(c_A, c_prev) + else: + c_next = self.step_Ng(c_A, c_prev, A, b) + + self.data_uv.c = c_next + + if self.converged(c_next, c_prev) and verbose == True: + self.epilogue(i, lam) + break + elif self.converged(c_next, c_prev): + break + + i += 1 + + if i == self.max_iter and verbose == True: + print("Max iteration reached!") + self.epilogue(i, lam) + break + elif i == self.max_iter: + break diff --git a/reference/pyrism/Solvers/Picard.py b/reference/pyrism/Solvers/Picard.py new file mode 100644 index 00000000..b9114926 --- /dev/null +++ b/reference/pyrism/Solvers/Picard.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 + +from pyrism.Core import RISM_Obj +import numpy as np +from dataclasses import dataclass, field +from .Solver_object import * +from numba import njit +from numba.core.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning +import warnings +import sys + +np.set_printoptions( + edgeitems=30, linewidth=180, formatter=dict(float=lambda x: "%.5g" % x) +) + + +@dataclass +class Picard(SolverObject): + def solve(self, RISM, Closure, lam, verbose=False): + i: int = 0 + + if verbose == True: + print("\nSolving solvent-solvent RISM equation...\n") + while i < self.max_iter: + c_prev = self.data_vv.c + try: + RISM() + c_A = Closure(self.data_vv) + except FloatingPointError as e: + print(e) + print("Possible divergence") + print("iteration: {i}".format(i=i)) + print("diff: {diff}".format(diff=(c_A - c_prev).sum())) + + c_next = self.step_Picard(c_A, c_prev) + + self.data_vv.c = c_next + + if self.converged(c_next, c_prev) and verbose == True: + self.epilogue(i, lam) + break + elif self.converged(c_next, c_prev): + break + + i += 1 + + if i == self.max_iter and verbose == True: + print("Max iteration reached!") + self.epilogue(i, lam) + break + elif i == self.max_iter: + break + + def solve_uv(self, RISM, Closure, lam, verbose=False): + i: int = 0 + if verbose == True: + print("\nSolving solute-solvent RISM equation...\n") + while i < self.max_iter: + c_prev = self.data_uv.c + try: + RISM() + c_A = Closure(self.data_uv) + except FloatingPointError as e: + print(e) + print("Possible divergence") + print("iteration: {i}".format(i=i)) + print("diff: {diff}".format(diff=(c_A - c_prev).sum())) + + c_next = self.step_Picard(c_A, c_prev) + + self.data_uv.c = c_next + + if self.converged(c_next, c_prev) and verbose == True: + self.epilogue(i, lam) + break + elif self.converged(c_next, c_prev): + break + + i += 1 + + if i == self.max_iter and verbose == True: + print("Max iteration reached!") + self.epilogue(i, lam) + break + elif i == self.max_iter: + break diff --git a/reference/pyrism/Solvers/Solver.py b/reference/pyrism/Solvers/Solver.py new file mode 100644 index 00000000..f1290a7d --- /dev/null +++ b/reference/pyrism/Solvers/Solver.py @@ -0,0 +1,20 @@ +import numpy as np +from .Ng import NgSolver +from .MDIIS import MDIIS +from .Picard import Picard +from .Gillan import Gillan + + +class Solver(object): + solver_dispatcher = { + "Picard": Picard, + "Ng": NgSolver, + "MDIIS": MDIIS, + "Gillan": Gillan, + } + + def __init__(self, solv): + self.solver = solv + + def get_solver(self): + return self.solver_dispatcher[self.solver] diff --git a/reference/pyrism/Solvers/Solver_object.py b/reference/pyrism/Solvers/Solver_object.py new file mode 100644 index 00000000..ffcf0df4 --- /dev/null +++ b/reference/pyrism/Solvers/Solver_object.py @@ -0,0 +1,39 @@ +from pyrism.Core import RISM_Obj +import numpy as np +from dataclasses import dataclass, field +from numba import njit + + +@dataclass +class SolverObject: + data_vv: RISM_Obj + tol: float + max_iter: int + damp_picard: float + rms: float = field(default=0.0) + data_uv: RISM_Obj = field(default=None) + + def step_Picard(self, curr, prev): + return prev + self.damp_picard * (curr - prev) + + def converged(self, curr, prev): + self.rms = converged_impl( + curr, prev, self.data_vv.grid.d_r, np.prod(curr.shape) + ) + + if self.rms < self.tol: + return True + else: + return False + + def epilogue(self, curr_iter, nlam): + print( + """Current Lambda: {nlam}\nTotal Iterations: {curr_iter}\nRMS: {rms}""".format( + nlam=nlam, curr_iter=curr_iter, rms=self.rms + ) + ) + + +@njit +def converged_impl(curr, prev, dr, denom): + return np.sqrt(dr * np.power((curr - prev), 2).sum() / denom) diff --git a/reference/pyrism/Solvers/__init__.py b/reference/pyrism/Solvers/__init__.py new file mode 100644 index 00000000..cf32b93c --- /dev/null +++ b/reference/pyrism/Solvers/__init__.py @@ -0,0 +1 @@ +from .Solver import Solver diff --git a/reference/pyrism/Util/Rotation.py b/reference/pyrism/Util/Rotation.py new file mode 100644 index 00000000..e25e014c --- /dev/null +++ b/reference/pyrism/Util/Rotation.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 + +import numpy as np +from scipy.spatial.transform import Rotation as R + + +def total_moment(dat): + total_mom = [] + dm_vecs = [] + for isp in dat.species: + total_charge = 0.0 + centre_of_charge = np.zeros(3, dtype=np.float64) + dipole_mom_vec = np.zeros(3, dtype=np.float64) + + for iat in isp.atom_sites: + total_charge += np.abs(iat.params[-1]) + + if total_charge == 0: + continue + + for iat in isp.atom_sites: + centre_of_charge += np.abs(iat.params[-1]) * iat.coords + centre_of_charge /= total_charge + + for iat in isp.atom_sites: + iat.coords -= centre_of_charge + + for iat in isp.atom_sites: + dipole_mom_vec += iat.params[-1] * iat.coords + + dipole_mom = np.sqrt(np.sum(dipole_mom_vec * dipole_mom_vec)) + + if dipole_mom < 1e-16: + continue + + total_mom.append(dipole_mom) + dm_vecs.append(dipole_mom_vec) + + return (np.asarray(total_mom).sum(), dm_vecs) + + +def dipole_moment(isp): + total_charge = 0.0 + centre_of_charge = np.zeros(3, dtype=np.float64) + dipole_mom_vec = np.zeros(3, dtype=np.float64) + + for iat in isp.atom_sites: + total_charge += np.abs(iat.params[-1]) + + if total_charge == 0: + return (0.0, np.asarray([0.0, 0.0, 0.0])) + + for iat in isp.atom_sites: + centre_of_charge += np.abs(iat.params[-1]) * iat.coords + centre_of_charge /= total_charge + + for iat in isp.atom_sites: + iat.coords -= centre_of_charge + + for iat in isp.atom_sites: + dipole_mom_vec += iat.params[-1] * iat.coords + + dipole_mom = np.sqrt(np.sum(dipole_mom_vec * dipole_mom_vec)) + + if dipole_mom < 1e-16: + return (0.0, np.asarray([0.0, 0.0, 0.0])) + + return dipole_mom, dipole_mom_vec + + +def quaternion_from_Euler_axis(angle, direction): + quat = np.zeros(4, dtype=np.float64) + + magn = np.sqrt(np.sum(direction * direction)) + quat[3] = np.cos(angle / 2.0) + if magn == 0: + quat[0:3] = 0 + else: + quat[0:3] = direction / magn * np.sin(angle / 2.0) + return quat + + +def align_dipole(dat): + zaxis = np.asarray([0.0, 0.0, 1.0]) + yaxis = np.asarray([0.0, 1.0, 0.0]) + + for isp in dat.species: + dm, dmvec = dipole_moment(isp) + if not dmvec.any(): + continue + angle = -np.arccos(dmvec[0] / np.sqrt(np.sum(dmvec * dmvec))) + quat = quaternion_from_Euler_axis(angle, np.copysign(zaxis, dmvec[1])) + rotation_around_z = R.from_quat(quat) + new_dmvec = np.zeros_like(dmvec) + for iat in isp.atom_sites: + iat.coords = rotation_around_z.apply(iat.coords) + + for iat in isp.atom_sites: + new_dmvec += iat.params[-1] * iat.coords + + angle_2 = -np.arccos(new_dmvec[2] / np.sqrt(np.sum(new_dmvec * new_dmvec))) + quat_2 = quaternion_from_Euler_axis(angle_2, yaxis) + final_dmvec = np.zeros_like(dmvec) + rotation_around_y = R.from_quat(quat_2) + for iat in isp.atom_sites: + iat.coords = rotation_around_y.apply(iat.coords) + + for iat in isp.atom_sites: + final_dmvec += iat.params[-1] * iat.coords + + +def check_symmetric(a, rtol=1e-05, atol=1e-08): + return np.allclose(a, a.T, rtol=rtol, atol=atol) + + +def j0(x): + return np.sin(x) / x + + +def j1(x): + return ((np.sin(x) / x) - np.cos(x)) / x diff --git a/reference/pyrism/Util/__init__.py b/reference/pyrism/Util/__init__.py new file mode 100644 index 00000000..fe81fe7b --- /dev/null +++ b/reference/pyrism/Util/__init__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python3 + +from .Rotation import * diff --git a/reference/pyrism/__init__.py b/reference/pyrism/__init__.py new file mode 100644 index 00000000..4d6a8b2d --- /dev/null +++ b/reference/pyrism/__init__.py @@ -0,0 +1,15 @@ +""" +pyrism +A pedagogical implementation of the RISM equations +""" + +# Add imports here +from .rism_ctrl import RismController +from .Closures import * +from .Solvers import * +from .Core import * +from .IntegralEquations import * +from .Util import * +from .Potentials import * +from .Functionals import * +from pyrism import librism diff --git a/reference/pyrism/__main__.py b/reference/pyrism/__main__.py new file mode 100644 index 00000000..905a34fb --- /dev/null +++ b/reference/pyrism/__main__.py @@ -0,0 +1,42 @@ +import click +from pyrism.rism_ctrl import * + + +@click.command() +@click.argument("filename", type=click.Path(exists=True)) +@click.option( + "-T", "--temp", "temperature", type=float, help="Change system temperature" +) +@click.option( + "-v", + "--verbose", + "verbosity", + is_flag=True, + help="Output job and iteration information", +) +@click.option( + "-w", + "--write", + "write", + type=click.Choice(["duv", "all"], case_sensitive=False), + help="Output the solvation free energy density [-w duv] or all solvent-solvent and solute-solvent files along with solvation free energy density [-w all]", +) +def cli(filename, temperature, verbosity, write): + mol = RismController(filename) + mol.initialise_controller() + if temperature is not None: + mol.vv.T = float(temperature) + mol.vv.calculate_beta() + if mol.uv_check: + mol.uv.T = float(temperature) + mol.uv.calculate_beta() + try: + mol.do_rism(verbose=verbosity) + except RuntimeError as e: + print(e) + if write == "duv": + mol.write_output(duv_only=True) + elif write == "all": + mol.write_output() + else: + pass diff --git a/reference/pyrism/data/0008noc_chloro.toml b/reference/pyrism/data/0008noc_chloro.toml new file mode 100644 index 00000000..4d329abf --- /dev/null +++ b/reference/pyrism/data/0008noc_chloro.toml @@ -0,0 +1,77 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + + + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 4.81 +adbcor = 1.5 + + + +[solvent] +nsv = 5 +nspv = 1 + + + +[solute] +nsu = 26 +nspu = 1 + + + +[solvent.water] +dens = 0.00751615 +ns = 5 +H = [ [ 7.9, 2.11286, 0.325656,], [ -1.302348, 0.821262, 0.0,],] +C = [ [ 55.05, 3.39624, -0.425848,], [ -0.384052, 0.242154, 0.0,],] +Cl1 = [ [ 133.35, 3.46744, 0.033397333,], [ 0.980261, 1.397754, 0.0,],] +Cl2 = [ [ 133.35, 3.46744, 0.033397333,], [ -0.384052, -0.765765, 1.476687,],] +Cl3 = [ [ 133.35, 3.46744, 0.033397333,], [ 0.384052, -0.765765, -1.476687,],] + + + +[solute.0008noc] +dens = 0.0 +ns = 26 +C1 = [ [ 33.2124892049157, 3.5, -0.0531,], [ 0.0, 0.762, 0.0,],] +C2 = [ [ 33.2124892049157, 3.5, -0.0531,], [ -0.0, -0.762, 0.0,],] +C3 = [ [ 33.2124892049157, 3.5, -0.0533,], [ 1.401, 1.364, 0.0,],] +C4 = [ [ 33.2124892049157, 3.5, -0.0533,], [ -1.401, -1.364, 0.0,],] +H5 = [ [ 15.096586002234407, 2.5, 0.0265,], [ -0.548, 1.123, 0.876,],] +H6 = [ [ 15.096586002234407, 2.5, 0.0265,], [ -0.548, 1.123, -0.876,],] +H7 = [ [ 15.096586002234407, 2.5, 0.0265,], [ 0.548, -1.123, 0.876,],] +H8 = [ [ 15.096586002234407, 2.5, 0.0265,], [ 0.548, -1.123, -0.876,],] +C9 = [ [ 33.2124892049157, 3.5, -0.0559,], [ 1.401, 2.889, 0.0,],] +C10 = [ [ 33.2124892049157, 3.5, -0.0559,], [ -1.401, -2.889, 0.0,],] +H11 = [ [ 15.096586002234407, 2.5, 0.0265,], [ 1.95, 1.004, -0.876,],] +H12 = [ [ 15.096586002234407, 2.5, 0.0265,], [ 1.95, 1.004, 0.876,],] +H13 = [ [ 15.096586002234407, 2.5, 0.0265,], [ -1.95, -1.004, -0.876,],] +H14 = [ [ 15.096586002234407, 2.5, 0.0265,], [ -1.95, -1.004, 0.876,],] +C15 = [ [ 33.2124892049157, 3.5, -0.0653,], [ 2.807, 3.476, 0.0,],] +C16 = [ [ 33.2124892049157, 3.5, -0.0653,], [ -2.807, -3.476, 0.0,],] +H17 = [ [ 15.096586002234407, 2.5, 0.0263,], [ 0.851, 3.246, 0.875,],] +H18 = [ [ 15.096586002234407, 2.5, 0.0263,], [ 0.851, 3.246, -0.875,],] +H19 = [ [ 15.096586002234407, 2.5, 0.0263,], [ -0.851, -3.246, 0.875,],] +H20 = [ [ 15.096586002234407, 2.5, 0.0263,], [ -0.851, -3.246, -0.875,],] +H21 = [ [ 15.096586002234407, 2.5, 0.023,], [ 2.788, 4.565, 0.0,],] +H22 = [ [ 15.096586002234407, 2.5, 0.023,], [ -2.788, -4.565, 0.0,],] +H23 = [ [ 15.096586002234407, 2.5, 0.023,], [ 3.363, 3.151, -0.88,],] +H24 = [ [ 15.096586002234407, 2.5, 0.023,], [ 3.363, 3.151, 0.88,],] +H25 = [ [ 15.096586002234407, 2.5, 0.023,], [ -3.363, -3.151, -0.88,],] +H26 = [ [ 15.096586002234407, 2.5, 0.023,], [ -3.363, -3.151, 0.88,],] diff --git a/reference/pyrism/data/001tetr_1.toml b/reference/pyrism/data/001tetr_1.toml new file mode 100644 index 00000000..ee67ae32 --- /dev/null +++ b/reference/pyrism/data/001tetr_1.toml @@ -0,0 +1,44 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 5 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +O = [ [ 78.2003154916, 3.166, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 23.1480985368, 0.8, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 23.1480985368, 0.8, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.001tetr_1] +dens = 0.0 +ns = 5 +Cl1 = [ [ 150.965860175403, 1.699999999835012, -0.0366,], [ 0.655, 1.447, -1.057,],] +C2 = [ [ 33.21248920964203, 1.7499999999584939, 0.1457,], [ 0.179, 0.309, 0.228,],] +Cl3 = [ [ 150.965860175403, 1.699999999835012, -0.0364,], [ -0.66, -1.085, -0.496,],] +Cl4 = [ [ 150.965860175403, 1.699999999835012, -0.0366,], [ 1.633, -0.255, 1.089,],] +Cl5 = [ [ 150.965860175403, 1.699999999835012, -0.0361,], [ -0.91, 1.128, 1.374,],] diff --git a/reference/pyrism/data/001tetr_1_maestro.toml b/reference/pyrism/data/001tetr_1_maestro.toml new file mode 100644 index 00000000..43b8bb04 --- /dev/null +++ b/reference/pyrism/data/001tetr_1_maestro.toml @@ -0,0 +1,44 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 5 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +O = [ [ 78.2003154916, 3.166, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 23.1480985368, 0.8, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 23.1480985368, 0.8, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.001tetr_1] +dens = 0.0 +ns = 5 +Cl1 = [ [ 150.965860175403, 3.4, -0.0366,], [ 0.655, 1.447, -1.057,],] +C2 = [ [ 33.21248920964203, 3.5, 0.1457,], [ 0.179, 0.309, 0.228,],] +Cl3 = [ [ 150.965860175403, 3.4, -0.0364,], [ -0.66, -1.085, -0.496,],] +Cl4 = [ [ 150.965860175403, 3.4, -0.0366,], [ 1.633, -0.255, 1.089,],] +Cl5 = [ [ 150.965860175403, 3.4, -0.0361,], [ -0.91, 1.128, 1.374,],] diff --git a/reference/pyrism/data/002eth.toml b/reference/pyrism/data/002eth.toml new file mode 100644 index 00000000..58fb8f37 --- /dev/null +++ b/reference/pyrism/data/002eth.toml @@ -0,0 +1,47 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 8 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +O = [ [ 78.2003154916, 3.166, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 23.1480985368, 0.8, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 23.1480985368, 0.8, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.0002eth] +dens = 0.0 +ns = 8 +C = [ [ 55.05221691240736, 1.6998347542253702, -0.0941,], [ 0.0, 0.763, 0.0,],] +C1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0941,], [ 0.0, -0.763, 0.0,],] +H = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 1.016, 1.157, 0.0,],] +H1 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ -1.016, -1.157, 0.0,],] +H2 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ -0.508, 1.157, 0.88,],] +H3 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ -0.508, 1.157, -0.88,],] +H4 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 0.508, -1.157, 0.88,],] +H5 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 0.508, -1.157, -0.88,],] diff --git a/reference/pyrism/data/003buta_12.toml b/reference/pyrism/data/003buta_12.toml new file mode 100644 index 00000000..3fa23234 --- /dev/null +++ b/reference/pyrism/data/003buta_12.toml @@ -0,0 +1,53 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 14 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +O = [ [ 78.2003154916, 3.166, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 23.1480985368, 0.8, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 23.1480985368, 0.8, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.003buta_12] +dens = 0.0 +ns = 14 +C1 = [ [ 33.21248920964203, 1.7499999999584939, -0.23939999999999997,], [ -0.803, 0.951, -0.734,],] +C2 = [ [ 33.21248920964203, 1.7499999999584939, -0.1611,], [ 0.006, 0.031, 0.19,],] +C3 = [ [ 33.21248920964203, 1.7499999999584939, -0.1611,], [ 1.494, -0.031, -0.19,],] +C4 = [ [ 33.21248920964203, 1.7499999999584939, -0.23939999999999997,], [ 2.303, -0.951, 0.734,],] +H5 = [ [ 15.09658600866531, 1.2499999999112534, 0.0793,], [ -1.853, 0.975, -0.44,],] +H6 = [ [ 15.09658600866531, 1.2499999999112534, 0.0794,], [ -0.76, 0.613, -1.77,],] +H7 = [ [ 15.09658600866531, 1.2499999999112534, 0.0793,], [ -0.43, 1.976, -0.702,],] +H8 = [ [ 15.09658600866531, 1.2499999999112534, 0.0813,], [ -0.423, -0.973, 0.163,],] +H9 = [ [ 15.09658600866531, 1.2499999999112534, 0.0813,], [ -0.097, 0.376, 1.221,],] +H10 = [ [ 15.09658600866531, 1.2499999999112534, 0.0813,], [ 1.923, 0.973, -0.163,],] +H11 = [ [ 15.09658600866531, 1.2499999999112534, 0.0813,], [ 1.597, -0.376, -1.221,],] +H12 = [ [ 15.09658600866531, 1.2499999999112534, 0.0793,], [ 3.353, -0.975, 0.44,],] +H13 = [ [ 15.09658600866531, 1.2499999999112534, 0.0793,], [ 1.93, -1.976, 0.702,],] +H14 = [ [ 15.09658600866531, 1.2499999999112534, 0.0794,], [ 2.26, -0.613, 1.77,],] diff --git a/reference/pyrism/data/0111die.toml b/reference/pyrism/data/0111die.toml new file mode 100644 index 00000000..ed9146c5 --- /dev/null +++ b/reference/pyrism/data/0111die.toml @@ -0,0 +1,57 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 4.81 +adbcor = 1.5 + +[solvent] +nsv = 5 +nspv = 1 + +[solute] +nsu = 16 +nspu = 1 + +[solvent.chloroform] +dens = 0.00751615 +ns = 5 +H = [ [ 15.096586002234407, 2.5, 0.0806,], [ -1.292, 0.833, 0.0,],] +C = [ [ 33.2124892049157, 3.5, 0.1805,], [ -0.384, 0.247, 0.0,],] +Cl1 = [ [ 150.9658600223441, 3.4, -0.087,], [ 0.979, 1.364, 0.0,],] +Cl2 = [ [ 150.9658600223441, 3.4, -0.087,], [ -0.384, -0.75, 1.453,],] +Cl3 = [ [ 150.9658600223441, 3.4, -0.087,], [ -0.384, -0.75, -1.453,],] + +[solute.0111die] +dens = 0.0 +ns = 16 +N1 = [ [ 85.54732067932832, 3.3, -0.3165,], [ -0.017, -0.992, 0.354,],] +H2 = [ [ 15.096586002234407, 0.5, 0.1219,], [ 0.134, -0.828, 1.341,],] +C3 = [ [ 33.2124892049157, 3.5, -0.007,], [ -1.34, -0.538, -0.048,],] +C4 = [ [ 33.2124892049157, 3.5, -0.007,], [ 1.106, -0.489, -0.429,],] +C5 = [ [ 33.2124892049157, 3.5, -0.0526,], [ -1.576, 0.973, -0.049,],] +H6 = [ [ 7.548293001117203, 2.5, 0.0421,], [ -2.063, -1.018, 0.612,],] +H7 = [ [ 7.548293001117203, 2.5, 0.0421,], [ -1.532, -0.932, -1.05,],] +C8 = [ [ 33.2124892049157, 3.5, -0.0526,], [ 1.804, 0.735, 0.16,],] +H9 = [ [ 7.548293001117203, 2.5, 0.0421,], [ 1.843, -1.288, -0.546,],] +H10 = [ [ 7.548293001117203, 2.5, 0.0421,], [ 0.738, -0.264, -1.433,],] +H11 = [ [ 15.096586002234407, 2.5, 0.0242,], [ -2.609, 1.198, -0.319,],] +H12 = [ [ 15.096586002234407, 2.5, 0.0242,], [ -1.383, 1.397, 0.937,],] +H13 = [ [ 15.096586002234407, 2.5, 0.0242,], [ -0.928, 1.475, -0.768,],] +H14 = [ [ 15.096586002234407, 2.5, 0.0242,], [ 2.65, 1.037, -0.458,],] +H15 = [ [ 15.096586002234407, 2.5, 0.0242,], [ 1.124, 1.58, 0.251,],] +H16 = [ [ 15.096586002234407, 2.5, 0.0242,], [ 2.189, 0.504, 1.155,],] diff --git a/reference/pyrism/data/0507iso.toml b/reference/pyrism/data/0507iso.toml new file mode 100644 index 00000000..2afeb928 --- /dev/null +++ b/reference/pyrism/data/0507iso.toml @@ -0,0 +1,54 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 7 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 15 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +O = [ [ 78.2003154916, 3.166, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 23.1480985368, 0.8, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 23.1480985368, 0.8, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.0507iso] +dens = 0.0 +ns = 15 +O = [ [ 105.87738995415428, 1.533236693729071, -0.5987999978048874,], [ 0.039, -0.0, 1.443,],] +C = [ [ 55.05221691240736, 1.6998347542253702, 0.14579999999999999,], [ -0.006, 0.0, 0.017,],] +C1 = [ [ 55.05221691240736, 1.6998347542253702, -0.1091,], [ 0.677, -1.255, -0.518,],] +C2 = [ [ 55.05221691240736, 1.6998347542253702, -0.1091,], [ -1.485, 0.0, -0.334,],] +C3 = [ [ 55.05221691240736, 1.6998347542253702, -0.1091,], [ 0.677, 1.255, -0.518,],] +H = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ 0.616, -1.3, -1.606,],] +H1 = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ -1.622, 0.0, -1.415,],] +H2 = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ 0.616, 1.3, -1.606,],] +H3 = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ 0.203, -2.144, -0.103,],] +H4 = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ -1.967, 0.884, 0.082,],] +H5 = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ 1.733, 1.265, -0.24,],] +H6 = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ 1.733, -1.265, -0.24,],] +H7 = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ -1.967, -0.884, 0.082,],] +H8 = [ [ 7.900546687705287, 1.324766393630111, 0.042699999999999995,], [ 0.203, 2.144, -0.103,],] +H9 = [ [ 23.1480985368, 0.8, 0.397,], [ 0.958, -0.0, 1.724,],] diff --git a/reference/pyrism/data/0521dic.toml b/reference/pyrism/data/0521dic.toml new file mode 100644 index 00000000..ca8619cb --- /dev/null +++ b/reference/pyrism/data/0521dic.toml @@ -0,0 +1,47 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 8 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +O = [ [ 78.2003154916, 3.166, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 23.1480985368, 0.8, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 23.1480985368, 0.8, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.0521dic] +dens = 0.0 +ns = 8 +C = [ [ 55.05221691240736, 1.6998347542253702, 0.022,], [ -0.489, -0.576, -0.0,],] +C1 = [ [ 55.05221691240736, 1.6998347542253702, 0.022,], [ 0.489, 0.576, 0.0,],] +Cl = [ [ 133.35317591783053, 1.7354707035731136, -0.18139999999999998,], [ -2.154, 0.07, 0.0,],] +Cl1 = [ [ 133.35317591783053, 1.7354707035731136, -0.18139999999999998,], [ 2.154, -0.07, -0.0,],] +H = [ [ 7.900546724050384, 1.2356765213210827, 0.0797,], [ -0.374, -1.191, 0.888,],] +H1 = [ [ 7.900546724050384, 1.2356765213210827, 0.0797,], [ -0.374, -1.19, -0.888,],] +H2 = [ [ 7.900546724050384, 1.2356765213210827, 0.0797,], [ 0.374, 1.19, 0.888,],] +H3 = [ [ 7.900546724050384, 1.2356765213210827, 0.0797,], [ 0.374, 1.191, -0.888,],] diff --git a/reference/pyrism/data/1-hexanol.toml b/reference/pyrism/data/1-hexanol.toml new file mode 100644 index 00000000..b6278bf9 --- /dev/null +++ b/reference/pyrism/data/1-hexanol.toml @@ -0,0 +1,71 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.05 +mdiis_damping = 0.05 +itermax = 10000 +tol = 1e-7 +diel = 78.4 +adbcor = 1.475 + +[solvent] +nsv = 5 +nspv = 3 + +[solute] +nsu = 21 +nspu = 1 + +[solvent.water] +dens = 0.033272748 +ns = 3 +O = [ [ 78.15, 3.1658, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 7.815, 1.1658, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 7.815, 1.1658, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solvent.na] +dens = 6.022e-5 +ns = 1 +Na = [ [ 50.322, 2.584, 1.0,], [ 0.0, 0.0, 0.0,],] + +[solvent.cl] +dens = 6.022e-5 +ns = 1 +Cl = [ [ 50.322, 4.401, -1.0,], [ 0.0, 0.0, 0.0,],] + +[solute.1-hexanol] +dens = 0.0 +ns = 21 +C1-0 = [ [ 33.21248923736589, 1.7500003699309452, -0.2592460002304868,], [ -3.775, -0.336, -0.01,],] +H1-1 = [ [ 15.096586017787878, 1.2500003916072766, 0.08698299995060996,], [ -4.672, 0.284, 0.028,],] +H2-2 = [ [ 15.096586017787878, 1.2500003916072766, 0.08622699988475659,], [ -3.81, -1.029, 0.832,],] +H3-3 = [ [ 15.096586017787878, 1.2500003916072766, 0.0862349999725611,], [ -3.817, -0.926, -0.927,],] +C2-4 = [ [ 33.21248923736589, 1.7500003699309452, -0.1762059997914643,], [ -2.506, 0.505, 0.034,],] +H4-5 = [ [ 15.096586017787878, 1.2500003916072766, 0.08886000010975563,], [ -2.495, 1.108, 0.946,],] +H5-6 = [ [ 15.096586017787878, 1.2500003916072766, 0.0889139998792688,], [ -2.501, 1.208, -0.804,],] +C3-7 = [ [ 33.21248923736589, 1.7500003699309452, -0.17380899996158553,], [ -1.242, -0.345, -0.019,],] +H6-8 = [ [ 15.096586017787878, 1.2500003916072766, 0.0894709998189032,], [ -1.254, -0.951, -0.931,],] +H7-9 = [ [ 15.096586017787878, 1.2500003916072766, 0.08941899979695209,], [ -1.245, -1.048, 0.82,],] +C4-10 = [ [ 33.21248923736589, 1.7500003699309452, -0.17120999983536656,], [ 0.038, 0.48, 0.019,],] +H8-11 = [ [ 15.096586017787878, 1.2500003916072766, 0.09160800008780451,], [ 0.049, 1.087, 0.929,],] +H9-12 = [ [ 15.096586017787878, 1.2500003916072766, 0.09199900012621896,], [ 0.042, 1.18, -0.822,],] +C5-13 = [ [ 33.21248923736589, 1.7500003699309452, -0.1782789999067077,], [ 1.297, -0.377, -0.033,],] +H10-14 = [ [ 15.096586017787878, 1.2500003916072766, 0.09272299984085433,], [ 1.295, -0.989, -0.939,],] +H11-15 = [ [ 15.096586017787878, 1.2500003916072766, 0.09706800019756012,], [ 1.314, -1.062, 0.82,],] +C6-16 = [ [ 33.21248923736589, 1.7500003699309452, -0.07856099998353665,], [ 2.557, 0.467, -0.011,],] +H12-17 = [ [ 15.096586017787878, 1.2500003916072766, 0.10132600001097557,], [ 2.57, 1.098, 0.883,],] +H13-18 = [ [ 15.096586017787878, 1.2500003916072766, 0.1076510001481701,], [ 2.587, 1.123, -0.881,],] +O1-19 = [ [ 85.54732083143385, 1.5600001819854985, -0.5148690000713411,], [ 3.745, -0.32, -0.068,],] +H14-20 = [ [ 15.096585978112984, 0.2500004347313527, 0.3536390000164633,], [ 3.767, -0.884, 0.712,],] diff --git a/reference/pyrism/data/1.toml b/reference/pyrism/data/1.toml new file mode 100644 index 00000000..bce2834f --- /dev/null +++ b/reference/pyrism/data/1.toml @@ -0,0 +1,55 @@ +[system] +temp = 300 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 40.96 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +mdiis_damping = 0.5 +itermax = 10000 +tol = 1E-7 +diel = 78.497 +adbcor = 1.5 + + +[solvent] +nsv = 3 +nspv = 1 +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.2526594071, 3.166, -0.8476], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [23.1635928747, 0.8, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [23.1635928747, 0.8, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute] +nsu = 1 +nspu = 1 +[solute.one] +dens = 0.0 +ns = 1 + +A1 = [ + [75.4829300112, 3.5, 0.0], + [0.0, 0.0, 0.0] +] diff --git a/reference/pyrism/data/118wate_488.toml b/reference/pyrism/data/118wate_488.toml new file mode 100644 index 00000000..86163895 --- /dev/null +++ b/reference/pyrism/data/118wate_488.toml @@ -0,0 +1,42 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 3 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +O = [ [ 78.2003154916, 3.166, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 23.1480985368, 0.8, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 23.1480985368, 0.8, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.118wate_488] +dens = 0.0 +ns = 3 +O1 = [ [ 78.20031553753515, 1.5827999998353526, -0.6279000016463344,], [ 0.0, -0.033, 0.0,],] +H2 = [ [ 23.1480985368, 0.4, 0.314,], [ 0.816, 0.554, 0.0,],] +H3 = [ [ 23.1480985368, 0.4, 0.314,], [ -0.816, 0.554, 0.0,],] diff --git a/reference/pyrism/data/24dimepen.toml b/reference/pyrism/data/24dimepen.toml new file mode 100644 index 00000000..5d9aedcc --- /dev/null +++ b/reference/pyrism/data/24dimepen.toml @@ -0,0 +1,62 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-6 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 23 +nspu = 1 + +[solvent.water] +dens = 0.033422858685 +ns = 3 +O = [ [ 78.15, 3.16572, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 7.815, 1.16572, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 7.815, 1.16572, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.24dimepen] +dens = 0.0 +ns = 23 +C = [ [ 55.05221691240736, 1.6998347542253702, -0.07139999999999999,], [ 0.086, 0.657, -0.717,],] +C1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0662,], [ -1.383, 0.283, -0.434,],] +C2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0662,], [ 1.122, 0.138, 0.3,],] +C3 = [ [ 55.05221691240736, 1.6998347542253702, -0.08984999972561093,], [ -1.596, -1.228, -0.341,],] +C4 = [ [ 55.05221691240736, 1.6998347542253702, -0.08984999972561093,], [ -1.842, 0.949, 0.867,],] +C5 = [ [ 55.05221691240736, 1.6998347542253702, -0.08984999972561093,], [ 1.087, -1.383, 0.447,],] +C6 = [ [ 55.05221691240736, 1.6998347542253702, -0.08984999972561093,], [ 2.526, 0.584, -0.122,],] +H = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 0.165, 1.75, -0.783,],] +H1 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 0.347, 0.277, -1.715,],] +H2 = [ [ 7.900546687705287, 1.324766393630111, 0.0452,], [ -1.991, 0.674, -1.26,],] +H3 = [ [ 7.900546687705287, 1.324766393630111, 0.0452,], [ 0.927, 0.586, 1.282,],] +H4 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -2.652, -1.425, -0.571,],] +H5 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -1.038, -1.785, -1.097,],] +H6 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -1.474, -1.642, 0.66,],] +H7 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -2.914, 0.782, 1.02,],] +H8 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -1.32, 0.552, 1.744,],] +H9 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -1.678, 2.031, 0.832,],] +H10 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 0.366, -1.716, 1.192,],] +H11 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 0.974, -1.904, -0.506,],] +H12 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 2.047, -1.73, 0.854,],] +H13 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 3.272, 0.283, 0.621,],] +H14 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 2.809, 0.144, -1.085,],] +H15 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 2.575, 1.673, -0.218,],] diff --git a/reference/pyrism/data/2_propanol.toml b/reference/pyrism/data/2_propanol.toml new file mode 100644 index 00000000..98c296c1 --- /dev/null +++ b/reference/pyrism/data/2_propanol.toml @@ -0,0 +1,111 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1E-7 +diel = 78.4 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +#Pettitt and Rossky TIP3P water model +[solvent.water] +dens = 0.03334 +ns = 3 + "O_w" = [ + [78.177, 3.15, -0.834], + [0.0, 0.0, 0.0] + ] + + "H1_w" = [ + [23.14810, 0.4, 0.417], + [9.57200000e-01, 0.0, 0.0] + ] + + "H2_w" = [ + [23.14810, 0.4, 0.417], + [-2.39988000e-01, 9.26627000e-01, 0.00000000e+00] + ] + +[solute] +nsu = 12 +nspu = 1 + +[solute.2propanol] +dens = 0.0 +ns = 12 + +"C1" = [ + [25.1609, 3.8, -0.115], + [-0.89, -0.343, -1.107] +] + +"C2" = [ + [25.1609, 3.8, 0.227], + [-0.073, -0.315, 0.183] +] + +"C3" = [ + [25.1609, 3.8, -0.115], + [1.42, -0.25, -0.121] +] + +"O" = [ + [85.5473, 3.07, -0.7], + [-0.376, 0.82, 0.977] +] + +"OH" = [ + [23.14809, 0.4, 0.435], + [-1.316, 0.824, 1.097] +] + +"H1" = [ + [25.1609, 2.5, 0.038], + [-0.293, -1.232, 0.784] +] + +"H2" = [ + [25.1609, 2.5, 0.038], + [2.019, -0.218, 0.799] +] + +"H3" = [ + [25.1609, 2.5, 0.038], + [1.678, 0.639, -0.711] +] + +"H4" = [ + [25.1609, 2.5, 0.038], + [1.735, -1.133, -0.693] +] + +"H5" = [ + [25.1609, 2.5, 0.038], + [-0.728, 0.558, -1.713] +] + +"H6" = [ + [25.1609, 2.5, 0.038], + [-0.613, -1.209, -1.722] +] + +"H7" = [ + [25.1609, 2.5, 0.038], + [-1.967, -0.415, -0.906] +] diff --git a/reference/pyrism/data/2_propanol_salt.toml b/reference/pyrism/data/2_propanol_salt.toml new file mode 100644 index 00000000..9dc9db5a --- /dev/null +++ b/reference/pyrism/data/2_propanol_salt.toml @@ -0,0 +1,125 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1E-7 +diel = 78.4 +adbcor = 1.5 + +[solvent] +nsv = 5 +nspv = 3 +[solvent.water] +dens = 3.3274431982198593E-02 +ns = 3 +"O" = [ + [78.15, 3.16571950504, -0.8476], + [0.0, 0.0, 0.0] +] + +"H1" = [ + [7.815, 1.16572, 0.4238], + [1.0, 0.0, 0.0] +] + +"H2" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solvent.na] +dens = 3.0110683E-06 +ns = 1 +"Na" = [ + [1.393909966, 3.32839761097, 1.0], + [0.0, 0.0, 0.0] +] + +[solvent.cl] +dens = 3.0110683E-06 +ns = 1 +"Cl" = [ + [50.32165925, 4.40103966761, -1.0], + [0.0, 0.0, 0.0] +] + +[solute] +nsu = 12 +nspu = 1 + +[solute.2propanol] +dens = 0.0 +ns = 12 + +"C1" = [ + [25.1609, 3.8, -0.115], + [-0.89, -0.343, -1.107] +] + +"C2" = [ + [25.1609, 3.8, 0.227], + [-0.073, -0.315, 0.183] +] + +"C3" = [ + [25.1609, 3.8, -0.115], + [1.42, -0.25, -0.121] +] + +"O" = [ + [85.5473, 3.07, -0.7], + [-0.376, 0.82, 0.977] +] + +"OH" = [ + [23.14809, 0.4, 0.435], + [-1.316, 0.824, 1.097] +] + +"H1" = [ + [25.1609, 2.5, 0.038], + [-0.293, -1.232, 0.784] +] + +"H2" = [ + [25.1609, 2.5, 0.038], + [2.019, -0.218, 0.799] +] + +"H3" = [ + [25.1609, 2.5, 0.038], + [1.678, 0.639, -0.711] +] + +"H4" = [ + [25.1609, 2.5, 0.038], + [1.735, -1.133, -0.693] +] + +"H5" = [ + [25.1609, 2.5, 0.038], + [-0.728, 0.558, -1.713] +] + +"H6" = [ + [25.1609, 2.5, 0.038], + [-0.613, -1.209, -1.722] +] + +"H7" = [ + [25.1609, 2.5, 0.038], + [-1.967, -0.415, -0.906] +] diff --git a/reference/pyrism/data/Ethanol_wat.toml b/reference/pyrism/data/Ethanol_wat.toml new file mode 100644 index 00000000..a139af0a --- /dev/null +++ b/reference/pyrism/data/Ethanol_wat.toml @@ -0,0 +1,100 @@ +#Taken from Lee and Maggiora 1993 + +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +picard_damping = 0.5 +depth = 8 +itermax = 10000 +tol = 1E-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +#Pettitt and Rossky TIP3P water model +[solvent.water] +dens = 0.03334 +ns = 3 + "O_w" = [ + [76.48937, 3.15, -0.834], + [0.0, 0.0, 0.0] + ] + + "H1_w" = [ + [23.14810, 0.4, 0.417], + [9.57200000e-01, 0.0, 0.0] + ] + + "H2_w" = [ + [23.14810, 0.4, 0.417], + [-2.39988000e-01, 9.26627000e-01, 0.00000000e+00] + ] + +[solute] +nsu = 9 +nspu = 1 + +[solute.methanol] +dens = 0.0 +ns = 9 + + +"C1" = [ + [25.16098, 3.8, 0.189], + [-0.2033, 0.0282, 0.5345] +] + +"C2" = [ + [25.16098, 3.8, -0.115], + [1.2699, -0.0477, 0.1772] +] + + +"O" = [ + [85.54, 3.07, -0.7], + [-0.9394, 0.0157, -0.6674] +] + +"H1" = [ + [25.16098, 2.5, 0.038], + [1.8853, -0.0401, 1.0854] +] + +"H2" = [ + [25.16098, 2.5, 0.038], + [1.5840, 0.8007, -0.4449] +] + +"H3" = [ + [25.16098, 2.5, 0.038], + [1.5089, -0.9636, -0.3791] +] + +"H4" = [ + [25.16098, 2.5, 0.038], + [-0.4993, -0.8287, 1.17142] +] + +"H5" = [ + [25.16098, 2.5, 0.038], + [-0.4235, 0.9513, 1.1064] +] + +"OH" = [ + [23.14810, 0.4, 0.435], + [-1.8540, 0.0626, -0.4252] +] diff --git a/reference/pyrism/data/HR1982.toml b/reference/pyrism/data/HR1982.toml new file mode 100644 index 00000000..d1d3efea --- /dev/null +++ b/reference/pyrism/data/HR1982.toml @@ -0,0 +1,37 @@ +[system] +temp = 72.0 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 1024 +radius = 10.24 +lam = 10 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "Ng" +depth = 8 +picard_damping = 0.01 +itermax = 10000 +tol = 1E-7 +diel = 1.538 +adbcor = 0.1 + +[solvent] +nsv = 2 +nspv = 1 + +[solvent.N2] +dens = 0.01867 +ns = 2 +"N1" = [ + [44.0, 3.341, 0.2], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"N2" = [ + [44.0, 3.341, -0.2], + [1.10000000e+00, 0.00000000e+00, 0.00000000e+00] +] diff --git a/reference/pyrism/data/HR1982N.toml b/reference/pyrism/data/HR1982N.toml new file mode 100644 index 00000000..fa5e9f16 --- /dev/null +++ b/reference/pyrism/data/HR1982N.toml @@ -0,0 +1,35 @@ +[system] +temp = 72 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 2048 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "PY" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.01 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 2 +nspv = 1 + +[solvent.N2] +dens = 0.01867 +ns = 2 +"N1" = [ + [44.0, 3.341, 0.0], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"N2" = [ + [44.0, 3.341, 0.0], + [1.10000000e+00, 0.00000000e+00, 0.00000000e+00] +] diff --git a/reference/pyrism/data/HR1982_Br2_I.toml b/reference/pyrism/data/HR1982_Br2_I.toml new file mode 100644 index 00000000..9542ff47 --- /dev/null +++ b/reference/pyrism/data/HR1982_Br2_I.toml @@ -0,0 +1,40 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 10.24 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 7 +picard_damping = 0.1 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.Br2X] +dens = 0.01175728342 +ns = 3 +"Br1" = [ + [245.7, 3.63, -0.48], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"Br2" = [ + [245.7, 3.63, -0.48], + [2.28400000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"X" = [ + [0.0724, 1.0, 0.96], + [1.14200000e+00, 0.00000000e+00, 0.00000000e+00] +] diff --git a/reference/pyrism/data/HR1982_Br2_III.toml b/reference/pyrism/data/HR1982_Br2_III.toml new file mode 100644 index 00000000..413d5f24 --- /dev/null +++ b/reference/pyrism/data/HR1982_Br2_III.toml @@ -0,0 +1,40 @@ +[system] +temp = 296.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.1 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.Br2X] +dens = 0.01175728342 +ns = 3 +"Br1" = [ + [130.0, 3.63, -0.3], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"Br2" = [ + [130.0, 3.63, -0.3], + [2.28400000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"X" = [ + [0.0724, 1.0, 0.6], + [1.14200000e+00, 0.00000000e+00, 0.00000000e+00] +] diff --git a/reference/pyrism/data/HR1982_Br2_IV.toml b/reference/pyrism/data/HR1982_Br2_IV.toml new file mode 100644 index 00000000..c358e599 --- /dev/null +++ b/reference/pyrism/data/HR1982_Br2_IV.toml @@ -0,0 +1,41 @@ +[system] +temp = 296.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "PY" +IE = "XRISM" +solver = "MDIIS" +depth = 7 +picard_damping = 0.001 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.Br2X] +dens = 0.01175728342 +ns = 3 + +"Br1" = [ + [130.0, 3.63, 0.0], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"Br2" = [ + [130.0, 3.63, 0.0], + [2.28400000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"X" = [ + [0.0724, 1.0, 0.0], + [1.14200000e+00, 0.00000000e+00, 0.00000000e+00] +] diff --git a/reference/pyrism/data/HR1982_HCl_II.toml b/reference/pyrism/data/HR1982_HCl_II.toml new file mode 100644 index 00000000..f11a28d5 --- /dev/null +++ b/reference/pyrism/data/HR1982_HCl_II.toml @@ -0,0 +1,36 @@ +[system] +temp = 210 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 2048 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "Ng" +picard_damping = 0.001 +itermax = 10000 +tol = 1E-7 +diel = 78 +adbcor = 0.5 + +[solvent] +nsv = 2 +nspv = 1 + +[solvent.HCl] +dens = 0.018 +ns = 2 +"H" = [ + [20.0, 2.735, 0.2], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"Cl" = [ + [259.0, 3.353, -0.2], + [1.25700000e+00, 0.00000000e+00, 0.00000000e+00] +] diff --git a/reference/pyrism/data/HR1982_HCl_III.toml b/reference/pyrism/data/HR1982_HCl_III.toml new file mode 100644 index 00000000..4ed25389 --- /dev/null +++ b/reference/pyrism/data/HR1982_HCl_III.toml @@ -0,0 +1,36 @@ +[system] +temp = 210 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 2048 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.001 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 2 +nspv = 1 + +[solvent.HCl] +dens = 0.018 +ns = 2 + +"H" = [ + [20.0, 0.4, 0.2], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"Cl" = [ + [259.0, 3.353, -0.2], + [1.30000000e+00, 0.00000000e+00, 0.00000000e+00] +] diff --git a/reference/pyrism/data/MSPCE_XRISM_methane.toml b/reference/pyrism/data/MSPCE_XRISM_methane.toml new file mode 100644 index 00000000..f99f95a2 --- /dev/null +++ b/reference/pyrism/data/MSPCE_XRISM_methane.toml @@ -0,0 +1,56 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 5 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 + "O_w" = [ + [78.2, 3.166, -0.8476], + [0.0, 0.0, 0.0] + ] + + "H1_w" = [ + [23.14810, 0.4, 0.4238], + [9.57200000e-01, 0.0, 0.0] + ] + + "H2_w" = [ + [23.14810, 0.4, 0.4238], + [-2.39988000e-01, 9.26627000e-01, 0.00000000e+00] + ] + +[solute.methane] +dens = 0.0 +ns = 5 +C1-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.1088,], [ 3.537, 1.423, 0.0,],] +H1-1 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 4.089, 2.224, 0.496,],] +H2-2 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 4.222, 0.611, -0.254,],] +H3-3 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 2.759, 1.049, 0.669,],] +H4-4 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 3.077, 1.81, -0.912,],] \ No newline at end of file diff --git a/reference/pyrism/data/MSPCE_XRISM_methane_UA.toml b/reference/pyrism/data/MSPCE_XRISM_methane_UA.toml new file mode 100644 index 00000000..3abbc721 --- /dev/null +++ b/reference/pyrism/data/MSPCE_XRISM_methane_UA.toml @@ -0,0 +1,52 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 1 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 + "O_w" = [ + [78.2, 3.166, -0.8476], + [0.0, 0.0, 0.0] + ] + + "H1_w" = [ + [23.14810, 0.4, 0.4238], + [9.57200000e-01, 0.0, 0.0] + ] + + "H2_w" = [ + [23.14810, 0.4, 0.4238], + [-2.39988000e-01, 9.26627000e-01, 0.00000000e+00] + ] + +[solute.methane] +dens = 0.0 +ns = 1 +CH4 = [ [137.882152154, 3.73, 0.0], [0.0, 0.0, 0.0] ] \ No newline at end of file diff --git a/reference/pyrism/data/Methanol_cSPCE.toml b/reference/pyrism/data/Methanol_cSPCE.toml new file mode 100644 index 00000000..a8bfaaec --- /dev/null +++ b/reference/pyrism/data/Methanol_cSPCE.toml @@ -0,0 +1,82 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 2048 +radius = 10.24 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1E-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O_w" = [ + [78.15, 3.16572, -0.8476], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1_w" = [ + [7.815, 1.16572, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2_w" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + + +[solute] +nsu = 6 +nspu = 1 + +[solute.methanol] +dens = 0.0 +ns = 6 + + +"C" = [ + [25.16098, 3.8, 0.15], + [0.7031, 0.0083, -0.1305] +] + +"O" = [ + [85.54, 3.07, -0.7], + [-0.6582, -0.0067, 0.1730] +] + +"H1" = [ + [25.16098, 2.5, 0.038], + [1.2001, 0.0363, 0.8431] +] + +"H2" = [ + [25.16098, 2.5, 0.038], + [0.9877, 0.8943, -0.7114] +] + +"H3" = [ + [25.16098, 2.5, 0.038], + [1.0155, -0.8918, -0.6742] +] + +"OH" = [ + [23.14810, 0.4, 0.435], + [-1.1326, -0.0311, -0.6482] +] diff --git a/reference/pyrism/data/Methanol_lue.toml b/reference/pyrism/data/Methanol_lue.toml new file mode 100644 index 00000000..07cefcc6 --- /dev/null +++ b/reference/pyrism/data/Methanol_lue.toml @@ -0,0 +1,83 @@ +#Taken from Lee and Maggiora 1993 + +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.475 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 + "O_w" = [ + [78.2, 3.166, -0.8476], + [0.0, 0.0, 0.0] + ] + + "H1_w" = [ + [23.14810, 0.4, 0.4238], + [9.57200000e-01, 0.0, 0.0] + ] + + "H2_w" = [ + [23.14810, 0.4, 0.4238], + [-2.39988000e-01, 9.26627000e-01, 0.00000000e+00] + ] + +[solute] +nsu = 6 +nspu = 1 + +[solute.methanol] +dens = 0.0 +ns = 6 + + +"C" = [ + [25.16098, 3.8, 0.15], + [0.7031, 0.0083, -0.1305] +] + +"O" = [ + [85.54, 3.07, -0.7], + [-0.6582, -0.0067, 0.1730] +] + +"H1" = [ + [25.16098, 2.5, 0.038], + [1.2001, 0.0363, 0.8431] +] + +"H2" = [ + [25.16098, 2.5, 0.038], + [0.9877, 0.8943, -0.7114] +] + +"H3" = [ + [25.16098, 2.5, 0.038], + [1.0155, -0.8918, -0.6742] +] + +"OH" = [ + [23.14810, 0.4, 0.435], + [-1.1326, -0.0311, -0.6482] +] diff --git a/reference/pyrism/data/Methanol_wat.toml b/reference/pyrism/data/Methanol_wat.toml new file mode 100644 index 00000000..1aba856b --- /dev/null +++ b/reference/pyrism/data/Methanol_wat.toml @@ -0,0 +1,84 @@ +#Taken from Lee and Maggiora 1993 + +[system] +temp = 300 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 16 +picard_damping = 0.5 +mdiis_damping = 0.5 +itermax = 10000 +tol = 1E-9 +diel = 78.497 +adbcor = 1.475 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.2526594071, 3.166, -0.8476], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [23.1635928747, 0.8, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [23.1635928747, 0.8, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute] +nsu = 6 +nspu = 1 + +[solute.methanol] +dens = 0.0 +ns = 6 + + +"C" = [ + [25.16098, 3.8, 0.15], + [0.7031, 0.0083, -0.1305] +] + +"O" = [ + [85.54, 3.07, -0.7], + [-0.6582, -0.0067, 0.1730] +] + +"H1" = [ + [25.16098, 2.5, 0.038], + [1.2001, 0.0363, 0.8431] +] + +"H2" = [ + [25.16098, 2.5, 0.038], + [0.9877, 0.8943, -0.7114] +] + +"H3" = [ + [25.16098, 2.5, 0.038], + [1.0155, -0.8918, -0.6742] +] + +"OH" = [ + [23.14810, 0.4, 0.435], + [-1.1326, -0.0311, -0.6482] +] diff --git a/reference/pyrism/data/PK_ModelII.toml b/reference/pyrism/data/PK_ModelII.toml new file mode 100644 index 00000000..0f1c352c --- /dev/null +++ b/reference/pyrism/data/PK_ModelII.toml @@ -0,0 +1,54 @@ +[system] +temp = 200 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.1 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 2 +nspv = 1 + +[solvent.nitrogen_like] +dens = 0.0187 +ns = 2 + +"N_1" = [ + [43.45782, 3.34, 0.2], + [0.0, 0.0, 0.0] +] + +"N_2" = [ + [43.45782, 3.34, -0.2], + [1.1, 0.0, 0.0] +] + +[solute] +nsu = 2 +nspu = 1 + +[solute.carbon_2] +dens = 0.0 +ns = 2 + +"C_1" = [ + [44.90642, 3.2, 0.1], + [1.54, 0.0, 0.0] +] + +"C_2" = [ + [44.90642, 3.2, -0.1], + [0.0, 0.0, 0.0] +] diff --git a/reference/pyrism/data/PK_ModelIII.toml b/reference/pyrism/data/PK_ModelIII.toml new file mode 100644 index 00000000..adc293ac --- /dev/null +++ b/reference/pyrism/data/PK_ModelIII.toml @@ -0,0 +1,58 @@ +[system] +temp = 200 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 2048 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.1 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 + "O_w" = [ + [59.78248, 3.215, -0.8], + [0.0, 0.0, 0.0] + ] + + "H1_w" = [ + [5.03220, 0.4, 0.4], + [9.57200000e-01, 0.0, 0.0] + ] + + "H2_w" = [ + [5.033200, 0.4, 0.4], + [-2.39988000e-01, 9.26627000e-01, 0.00000000e+00] + ] + +[solute] +nsu = 2 +nspu = 1 + +[solute.carbon_2] +dens = 0.0 +ns = 2 + +"C_1" = [ + [44.90642, 3.2, 0.1], + [2.0, 0.0, 0.0] +] + +"C_2" = [ + [44.90642, 3.2, -0.1], + [0.0, 0.0, 0.0] +] diff --git a/reference/pyrism/data/RISM-MOL_methane.toml b/reference/pyrism/data/RISM-MOL_methane.toml new file mode 100644 index 00000000..00fa9603 --- /dev/null +++ b/reference/pyrism/data/RISM-MOL_methane.toml @@ -0,0 +1,56 @@ +[system] +temp = 300 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 15 +picard_damping = 0.1 +mdiis_damping = 0.6 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 5 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.2526594071, 3.166, -0.8476], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [23.1635928747, 0.8, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [23.1635928747, 0.8, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.methane] +dens = 0.0 +ns = 5 +C1-0 = [ [ 33.2347202115, 3.5, -0.24,], [ -0.4458, -0.0120, 0.0,],] +H1-1 = [ [ 15.1066910052, 2.5, 0.06,], [ -0.0823, -1.0402, 0.0,],] +H2-2 = [ [ 15.1066910052, 2.5, 0.06,], [ -0.0823, 0.5020, 0.8904,],] +H3-3 = [ [ 15.1066910052, 2.5, 0.06,], [ -0.0823, 0.5020, -0.8904,],] +H4-4 = [ [ 15.1066910052, 2.5, 0.06,], [ -1.5363, -0.0120, 0.0,],] \ No newline at end of file diff --git a/reference/pyrism/data/SPC.toml b/reference/pyrism/data/SPC.toml new file mode 100644 index 00000000..afcb7dfc --- /dev/null +++ b/reference/pyrism/data/SPC.toml @@ -0,0 +1,41 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 16 +picard_damping = 0.01 +itermax = 10000 +tol = 1E-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 +[solvent.water] +dens = 3.3329515566149999E-02 +ns = 3 +"O" = [ + [78.15, 3.16571950504, -0.8476], + [0.0, 0.0, 0.0] +] + +"H1" = [ + [7.815, 1.16572, 0.4238], + [1.0, 0.0, 0.0] +] + +"H2" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] diff --git a/reference/pyrism/data/XRISM_DB.toml b/reference/pyrism/data/XRISM_DB.toml new file mode 100644 index 00000000..61a0b9cc --- /dev/null +++ b/reference/pyrism/data/XRISM_DB.toml @@ -0,0 +1,44 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM-DB" +solver = "MDIIS" +depth = 12 +picard_damping = 0.5 +mdiis_damping = 0.2 +itermax = 10000 +tol = 1E-5 +diel = 78.497 +adbcor = 1.5 +B = -3.2 + + +[solvent] +nsv = 3 +nspv = 1 +[solvent.water] +dens = 3.3422858685000001E-002 +ns = 3 +"O" = [ + [78.15, 3.16572, -0.8476], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.16572, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] diff --git a/reference/pyrism/data/argon.toml b/reference/pyrism/data/argon.toml new file mode 100644 index 00000000..bb34d361 --- /dev/null +++ b/reference/pyrism/data/argon.toml @@ -0,0 +1,44 @@ +[system] +temp = 85 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1E-7 +diel = 1.5053 +adbcor = 0.5 + +[solvent] +nsv = 1 +nspv = 1 + +[solvent.argon] +dens = 0.021017479720736955 +ns = 1 +"Ar" = [ + [120.0, 3.4, 0.0], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +[solute] +nsu = 1 +nspu = 1 + +[solute.argon] +dens = 0.0 +ns = 1 +"Ar_uv" = [ + [120.0, 3.4, 0.0], + [0.0, 0.0, 0.0] +] diff --git a/reference/pyrism/data/argon_mono.toml b/reference/pyrism/data/argon_mono.toml new file mode 100644 index 00000000..bb34d361 --- /dev/null +++ b/reference/pyrism/data/argon_mono.toml @@ -0,0 +1,44 @@ +[system] +temp = 85 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1E-7 +diel = 1.5053 +adbcor = 0.5 + +[solvent] +nsv = 1 +nspv = 1 + +[solvent.argon] +dens = 0.021017479720736955 +ns = 1 +"Ar" = [ + [120.0, 3.4, 0.0], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +[solute] +nsu = 1 +nspu = 1 + +[solute.argon] +dens = 0.0 +ns = 1 +"Ar_uv" = [ + [120.0, 3.4, 0.0], + [0.0, 0.0, 0.0] +] diff --git a/reference/pyrism/data/argon_uv.toml b/reference/pyrism/data/argon_uv.toml new file mode 100644 index 00000000..aff578ed --- /dev/null +++ b/reference/pyrism/data/argon_uv.toml @@ -0,0 +1,48 @@ +[system] +temp = 200 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 512 +radius = 10.24 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 5 +picard_damping = 0.001 +itermax = 10000 +tol = 1E-12 + +[solvent] +nsv = 1 +nspv = 1 + +[solvent.argon] +dens = 0.02 +ns = 1 +"Ar" = [ + [115.8875283, 3.4, 0.0], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + + +[solute] +nsu = 2 +nspu = 1 + +[solute.diargon] +dens = 0.0 +ns = 2 +"Ar1" = [ + [115.8875283, 3.4, 0.0], + [0.0, 0.0, 0.0] +] + +"Ar2" = [ + [115.8875283, 3.4, 0.0], + [2.0, 0.0, 0.0] +] diff --git a/reference/pyrism/data/cSPCE.toml b/reference/pyrism/data/cSPCE.toml new file mode 100644 index 00000000..4d2641fa --- /dev/null +++ b/reference/pyrism/data/cSPCE.toml @@ -0,0 +1,43 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.5 +mdiis_damping = 0.2 +itermax = 10000 +tol = 1E-5 +diel = 78.497 +adbcor = 1.5 + + +[solvent] +nsv = 3 +nspv = 1 +[solvent.water] +dens = 3.3422858685000001E-002 +ns = 3 +"O" = [ + [78.15, 3.16572, -0.8476], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.16572, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] diff --git a/reference/pyrism/data/cSPCE_DRISM_butane.toml b/reference/pyrism/data/cSPCE_DRISM_butane.toml new file mode 100644 index 00000000..2e1a10b0 --- /dev/null +++ b/reference/pyrism/data/cSPCE_DRISM_butane.toml @@ -0,0 +1,66 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "DRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.0 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 14 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.butane] +dens = 0.0 +ns = 14 +C-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 0.0, 0.0, 0.0,],] +C1-1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 1.526, 0.0, 0.0,],] +C2-2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 2.035, 1.439, 0.0,],] +C3-3 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 2.882, 1.679, -1.246,],] +H-4 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.363, -0.514, 0.89,],] +H1-5 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.363, -0.514, -0.89,],] +H2-6 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.363, 1.028, 0.0,],] +H3-7 = [ [ 7.900546687705287, 1.324766393630111, 0.0372,], [ 1.889, -0.514, -0.89,],] +H4-8 = [ [ 7.900546687705287, 1.324766393630111, 0.0372,], [ 1.889, -0.514, 0.89,],] +H5-9 = [ [ 7.900546687705287, 1.324766393630111, 0.0372,], [ 2.64, 1.61, 0.89,],] +H6-10 = [ [ 7.900546687705287, 1.324766393630111, 0.0372,], [ 1.187, 2.124, 0.0,],] +H7-11 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 2.277, 1.507, -2.136,],] +H8-12 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 3.73, 0.993, -1.246,],] +H9-13 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 3.246, 2.706, -1.246,],] + diff --git a/reference/pyrism/data/cSPCE_DRISM_ethane.toml b/reference/pyrism/data/cSPCE_DRISM_ethane.toml new file mode 100644 index 00000000..b291507d --- /dev/null +++ b/reference/pyrism/data/cSPCE_DRISM_ethane.toml @@ -0,0 +1,59 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "DRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.0 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 8 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.ethane] +dens = 0.0 +ns = 8 +C1-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.0941,], [ -0.234, 0.376, -0.007,],] +C2-1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0941,], [ 0.556, -0.12, -1.221,],] +H1-2 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ -0.258, 1.49, 0.026,],] +H2-3 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ -1.287, 0.012, -0.04,],] +H3-4 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 0.224, 0.015, 0.943,],] +H4-5 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 0.58, -1.234, -1.254,],] +H5-6 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 0.098, 0.242, -2.171,],] +H6-7 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 1.609, 0.244, -1.188,],] diff --git a/reference/pyrism/data/cSPCE_DRISM_methane.toml b/reference/pyrism/data/cSPCE_DRISM_methane.toml new file mode 100644 index 00000000..aca83387 --- /dev/null +++ b/reference/pyrism/data/cSPCE_DRISM_methane.toml @@ -0,0 +1,56 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 16 +picard_damping = 0.3 +mdiis_damping = 0.5 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 5 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.methane] +dens = 0.0 +ns = 5 +C1-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.1088,], [ 3.537, 1.423, 0.0,],] +H1-1 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 4.089, 2.224, 0.496,],] +H2-2 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 4.222, 0.611, -0.254,],] +H3-3 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 2.759, 1.049, 0.669,],] +H4-4 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 3.077, 1.81, -0.912,],] \ No newline at end of file diff --git a/reference/pyrism/data/cSPCE_DRISM_octane.toml b/reference/pyrism/data/cSPCE_DRISM_octane.toml new file mode 100644 index 00000000..1bbdf84f --- /dev/null +++ b/reference/pyrism/data/cSPCE_DRISM_octane.toml @@ -0,0 +1,78 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "DRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.0 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 26 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.octane] +dens = 0.0 +ns = 26 +C1-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 2.142, 1.395, -8.932,],] +C2-1 = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 3.631, 1.416, -8.537,],] +C3-2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 4.203, -0.012, -8.612,],] +C4-3 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 5.691, 0.009, -8.218,],] +H11-4 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 1.604, 0.76, -8.26,],] +H12-5 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 1.745, 2.388, -8.88,],] +H13-6 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 2.043, 1.024, -9.93,],] +H21-7 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 4.169, 2.051, -9.21,],] +H22-8 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 3.731, 1.788, -7.539,],] +H31-9 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 3.665, -0.647, -7.94,],] +H32-10 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 4.104, -0.384, -9.61,],] +H41-11 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 5.793, 0.388, -7.201,],] +H42-12 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 6.24, 0.656, -8.903,],] +C5-13 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 6.263, -1.418, -8.293,],] +H5-14 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 6.162, -1.797, -9.309,],] +H9-15 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 5.715, -2.065, -7.608,],] +C6-16 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 7.75, -1.397, -7.899,],] +H6-17 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 7.852, -1.018, -6.882,],] +H10-18 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 8.299, -0.75, -8.583,],] +C7-19 = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 8.321, -2.824, -7.973,],] +H7-20 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 8.221, -3.203, -8.99,],] +H14-21 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 7.774, -3.471, -7.288,],] +C8-22 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 9.809, -2.803, -7.579,],] +H8-23 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 10.214, -3.813, -7.632,],] +H15-24 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 10.358, -2.156, -8.264,],] +H16-25 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 9.911, -2.424, -6.562,],] + diff --git a/reference/pyrism/data/cSPCE_DRISM_propane.toml b/reference/pyrism/data/cSPCE_DRISM_propane.toml new file mode 100644 index 00000000..5ca8d76f --- /dev/null +++ b/reference/pyrism/data/cSPCE_DRISM_propane.toml @@ -0,0 +1,62 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "DRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.355 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 11 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.propane] +dens = 0.0 +ns = 11 +C-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.0931,], [ 0.0, 0.0, 0.0,],] +C1-1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0814,], [ 1.536, 0.0, 0.0,],] +C2-2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0931,], [ 2.065, 1.442, 0.0,],] +H-3 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.368, 0.509, 0.891,],] +H1-4 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.353, -1.031, 0.0,],] +H2-5 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.368, 0.509, -0.891,],] +H3-6 = [ [ 7.900546687705287, 1.324766393630111, 0.0367,], [ 1.897, -0.517, -0.89,],] +H4-7 = [ [ 7.900546687705287, 1.324766393630111, 0.0367,], [ 1.897, -0.517, 0.889,],] +H5-8 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 1.714, 1.963, 0.891,],] +H6-9 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 1.714, 1.963, -0.891,],] +H7-10 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 3.155, 1.418, 0.0,],] diff --git a/reference/pyrism/data/cSPCE_NaCl.toml b/reference/pyrism/data/cSPCE_NaCl.toml new file mode 100644 index 00000000..879d9e64 --- /dev/null +++ b/reference/pyrism/data/cSPCE_NaCl.toml @@ -0,0 +1,58 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 20 +picard_damping = 0.5 +mdiis_damping = 0.2 +itermax = 10000 +tol = 1E-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 5 +nspv = 3 +[solvent.water] +dens = 3.3274431982198593E-02 +ns = 3 +"O" = [ + [78.15, 3.16571950504, -0.8476], + [0.0, 0.0, 0.0] +] + +"H1" = [ + [7.815, 1.16572, 0.4238], + [1.0, 0.0, 0.0] +] + +"H2" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solvent.na] +dens = 3.0110683E-06 +ns = 1 +"Na" = [ + [1.393909966, 3.32839761097, 1.0], + [0.0, 0.0, 0.0] +] + +[solvent.cl] +dens = 3.0110683E-06 +ns = 1 +"Cl" = [ + [50.32165925, 4.40103966761, -1.0], + [0.0, 0.0, 0.0] +] diff --git a/reference/pyrism/data/cSPCE_XRISM.toml b/reference/pyrism/data/cSPCE_XRISM.toml new file mode 100644 index 00000000..b116a0ee --- /dev/null +++ b/reference/pyrism/data/cSPCE_XRISM.toml @@ -0,0 +1,43 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 1000 +tol = 1E-5 +diel = 78.497 +adbcor = 1.5 + + +[solvent] +nsv = 3 +nspv = 1 +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] diff --git a/reference/pyrism/data/cSPCE_XRISM_butane.toml b/reference/pyrism/data/cSPCE_XRISM_butane.toml new file mode 100644 index 00000000..7271d233 --- /dev/null +++ b/reference/pyrism/data/cSPCE_XRISM_butane.toml @@ -0,0 +1,66 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 14 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.butane] +dens = 0.0 +ns = 14 +C-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 0.0, 0.0, 0.0,],] +C1-1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 1.526, 0.0, 0.0,],] +C2-2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 2.035, 1.439, 0.0,],] +C3-3 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 2.882, 1.679, -1.246,],] +H-4 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.363, -0.514, 0.89,],] +H1-5 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.363, -0.514, -0.89,],] +H2-6 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.363, 1.028, 0.0,],] +H3-7 = [ [ 7.900546687705287, 1.324766393630111, 0.0372,], [ 1.889, -0.514, -0.89,],] +H4-8 = [ [ 7.900546687705287, 1.324766393630111, 0.0372,], [ 1.889, -0.514, 0.89,],] +H5-9 = [ [ 7.900546687705287, 1.324766393630111, 0.0372,], [ 2.64, 1.61, 0.89,],] +H6-10 = [ [ 7.900546687705287, 1.324766393630111, 0.0372,], [ 1.187, 2.124, 0.0,],] +H7-11 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 2.277, 1.507, -2.136,],] +H8-12 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 3.73, 0.993, -1.246,],] +H9-13 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 3.246, 2.706, -1.246,],] + diff --git a/reference/pyrism/data/cSPCE_XRISM_ethane.toml b/reference/pyrism/data/cSPCE_XRISM_ethane.toml new file mode 100644 index 00000000..6ff98d9e --- /dev/null +++ b/reference/pyrism/data/cSPCE_XRISM_ethane.toml @@ -0,0 +1,59 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 8 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.ethane] +dens = 0.0 +ns = 8 +C1-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.0941,], [ -0.234, 0.376, -0.007,],] +C2-1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0941,], [ 0.556, -0.12, -1.221,],] +H1-2 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ -0.258, 1.49, 0.026,],] +H2-3 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ -1.287, 0.012, -0.04,],] +H3-4 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 0.224, 0.015, 0.943,],] +H4-5 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 0.58, -1.234, -1.254,],] +H5-6 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 0.098, 0.242, -2.171,],] +H6-7 = [ [ 7.900546687705287, 1.324766393630111, 0.0317,], [ 1.609, 0.244, -1.188,],] diff --git a/reference/pyrism/data/cSPCE_XRISM_ethene.toml b/reference/pyrism/data/cSPCE_XRISM_ethene.toml new file mode 100644 index 00000000..133d41e6 --- /dev/null +++ b/reference/pyrism/data/cSPCE_XRISM_ethene.toml @@ -0,0 +1,57 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-5 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 6 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.ethene] +dens = 0.0 +ns = 6 +C = [ [ 43.276879937664646, 1.6998347539724155, -0.21799999999999997,], [ -0.667, 0.0, 0.0,],] +C1 = [ [ 43.276879937664646, 1.6998347539724155, -0.21799999999999997,], [ 0.667, 0.0, 0.0,],] +H = [ [ 7.548293033434298, 1.2998212293675426, 0.10899999999999999,], [ -1.221, -0.929, 0.071,],] +H1 = [ [ 7.548293033434298, 1.2998212293675426, 0.10899999999999999,], [ -1.221, 0.929, -0.071,],] +H2 = [ [ 7.548293033434298, 1.2998212293675426, 0.10899999999999999,], [ 1.221, 0.929, -0.071,],] +H3 = [ [ 7.548293033434298, 1.2998212293675426, 0.10899999999999999,], [ 1.221, -0.929, 0.071,],] \ No newline at end of file diff --git a/reference/pyrism/data/cSPCE_XRISM_methane.toml b/reference/pyrism/data/cSPCE_XRISM_methane.toml new file mode 100644 index 00000000..50669995 --- /dev/null +++ b/reference/pyrism/data/cSPCE_XRISM_methane.toml @@ -0,0 +1,56 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 4096 +radius = 256 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.1 +mdiis_damping = 0.6 +itermax = 10000 +tol = 1E-5 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 5 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.methane] +dens = 0.0 +ns = 5 +C1-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.1088,], [ 3.537, 1.423, 0.0,],] +H1-1 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 4.089, 2.224, 0.496,],] +H2-2 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 4.222, 0.611, -0.254,],] +H3-3 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 2.759, 1.049, 0.669,],] +H4-4 = [ [ 7.900546687705287, 1.324766393630111, 0.026699999999999998,], [ 3.077, 1.81, -0.912,],] diff --git a/reference/pyrism/data/cSPCE_XRISM_methane_UA.toml b/reference/pyrism/data/cSPCE_XRISM_methane_UA.toml new file mode 100644 index 00000000..f2095677 --- /dev/null +++ b/reference/pyrism/data/cSPCE_XRISM_methane_UA.toml @@ -0,0 +1,52 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-5 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 1 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.methane] +dens = 0.0 +ns = 1 +CH4 = [ [137.882152154, 3.73, 0.0], [0.0, 0.0, 0.0] ] \ No newline at end of file diff --git a/reference/pyrism/data/cSPCE_XRISM_octane.toml b/reference/pyrism/data/cSPCE_XRISM_octane.toml new file mode 100644 index 00000000..a91963be --- /dev/null +++ b/reference/pyrism/data/cSPCE_XRISM_octane.toml @@ -0,0 +1,78 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 26 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.octane] +dens = 0.0 +ns = 26 +C1-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 2.142, 1.395, -8.932,],] +C2-1 = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 3.631, 1.416, -8.537,],] +C3-2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 4.203, -0.012, -8.612,],] +C4-3 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 5.691, 0.009, -8.218,],] +H11-4 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 1.604, 0.76, -8.26,],] +H12-5 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 1.745, 2.388, -8.88,],] +H13-6 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 2.043, 1.024, -9.93,],] +H21-7 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 4.169, 2.051, -9.21,],] +H22-8 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 3.731, 1.788, -7.539,],] +H31-9 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 3.665, -0.647, -7.94,],] +H32-10 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 4.104, -0.384, -9.61,],] +H41-11 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 5.793, 0.388, -7.201,],] +H42-12 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 6.24, 0.656, -8.903,],] +C5-13 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 6.263, -1.418, -8.293,],] +H5-14 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 6.162, -1.797, -9.309,],] +H9-15 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 5.715, -2.065, -7.608,],] +C6-16 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 7.75, -1.397, -7.899,],] +H6-17 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 7.852, -1.018, -6.882,],] +H10-18 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 8.299, -0.75, -8.583,],] +C7-19 = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 8.321, -2.824, -7.973,],] +H7-20 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 8.221, -3.203, -8.99,],] +H14-21 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 7.774, -3.471, -7.288,],] +C8-22 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 9.809, -2.803, -7.579,],] +H8-23 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 10.214, -3.813, -7.632,],] +H15-24 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 10.358, -2.156, -8.264,],] +H16-25 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 9.911, -2.424, -6.562,],] + diff --git a/reference/pyrism/data/cSPCE_XRISM_propane.toml b/reference/pyrism/data/cSPCE_XRISM_propane.toml new file mode 100644 index 00000000..ce30de4f --- /dev/null +++ b/reference/pyrism/data/cSPCE_XRISM_propane.toml @@ -0,0 +1,62 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.3 +mdiis_damping = 0.3 +itermax = 10000 +tol = 1E-8 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 11 +nspu = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solute.propane] +dens = 0.0 +ns = 11 +C-0 = [ [ 55.05221691240736, 1.6998347542253702, -0.0931,], [ 0.0, 0.0, 0.0,],] +C1-1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0814,], [ 1.536, 0.0, 0.0,],] +C2-2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0931,], [ 2.065, 1.442, 0.0,],] +H-3 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.368, 0.509, 0.891,],] +H1-4 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.353, -1.031, 0.0,],] +H2-5 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ -0.368, 0.509, -0.891,],] +H3-6 = [ [ 7.900546687705287, 1.324766393630111, 0.0367,], [ 1.897, -0.517, -0.89,],] +H4-7 = [ [ 7.900546687705287, 1.324766393630111, 0.0367,], [ 1.897, -0.517, 0.889,],] +H5-8 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 1.714, 1.963, 0.891,],] +H6-9 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 1.714, 1.963, -0.891,],] +H7-10 = [ [ 7.900546687705287, 1.324766393630111, 0.032366999994512216,], [ 3.155, 1.418, 0.0,],] diff --git a/reference/pyrism/data/chg_org_solu.toml b/reference/pyrism/data/chg_org_solu.toml new file mode 100644 index 00000000..050cd787 --- /dev/null +++ b/reference/pyrism/data/chg_org_solu.toml @@ -0,0 +1,49 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 20 +picard_damping = 0.05 +itermax = 10000 +tol = 1e-5 +diel = 35.6881 +adbcor = 1.5 + +[solvent] +nsv = 6 +nspv = 1 + +[solute] +nsu = 7 +nspu = 1 + +[solvent.acetonitrile] +dens = 0.011530553 +ns = 6 +C = [ [ 105.67610295052589, 3.399669505301963, 0.2087,], [ 0.0, 0.28, 0.0,],] +C1 = [ [ 55.05221691240736, 3.3996695084507405, -0.045,], [ -0.0, -1.182, 0.0,],] +H = [ [ 7.900546687705287, 2.649532787260222, 0.0707,], [ 1.027, -1.558, 0.0,],] +H1 = [ [ 7.900546687705287, 2.649532787260222, 0.0707,], [ -0.513, -1.558, 0.889,],] +H2 = [ [ 7.900546687705287, 2.649532787260222, 0.0707,], [ -0.513, -1.558, -0.889,],] +N = [ [ 85.54732063789672, 3.2499985240310356, -0.37579999999999997,], [ 0.0, 1.441, 0.0,],] + +[solute.i059] +dens = 0.0 +ns = 7 +H = [ [ 7.900546687705287, 2.649532787260222, 0.1277,], [ 1.711, -1.071, -0.086,],] +C = [ [ 55.05221691240736, 3.3996695084507405, 0.0319,], [ 1.344, -0.049, -0.001,],] +C1 = [ [ 43.276879937664646, 3.399669507944831, 1.0796000010975562,], [ -0.211, 0.001, -0.003,],] +O = [ [ 105.67610193604281, 2.959921901644687, -0.24729999999999996,], [ -0.797, -1.1, 0.001,],] +H1 = [ [ 7.900546687705287, 2.649532787260222, 0.1277,], [ 1.729, 0.556, -0.823,],] +H2 = [ [ 7.900546687705287, 2.649532787260222, 0.1277,], [ 1.712, 0.394, 0.926,],] +O1 = [ [ 105.67610193604281, 2.959921901644687, -0.24729999999999996,], [ -0.697, 1.151, 0.0,],] diff --git a/reference/pyrism/data/chloro.toml b/reference/pyrism/data/chloro.toml new file mode 100644 index 00000000..0777989f --- /dev/null +++ b/reference/pyrism/data/chloro.toml @@ -0,0 +1,46 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 2 +adbcor = 1.5 + +[solvent] +nsv = 5 +nspv = 1 + +[solute] +nsu = 5 +nspu = 1 + +[solvent.chloroform] +dens = 0.00751615 +ns = 5 +H = [ [ 7.9, 2.11286, 0.0,], [ -1.302348, 0.821262, 0.0,],] +C = [ [ 55.05, 3.39624, 0.0,], [ -0.384052, 0.242154, 0.0,],] +Cl1 = [ [ 133.35, 3.46744, 0.0,], [ 0.980261, 1.397754, 0.0,],] +Cl2 = [ [ 133.35, 3.46744, 0.0,], [ -0.384052, -0.765765, 1.476687,],] +Cl3 = [ [ 133.35, 3.46744, 0.0,], [ 0.384052, -0.765765, -1.476687,],] + +[solute.chloroform_u] +dens = 0.0 +ns = 5 +H = [ [ 7.9, 2.11286, 0.0,], [ 2.697652, 4.821262, 4.0,],] +C = [ [ 55.05, 3.39624, 0.0,], [ 3.615948, 4.242154, 4.0,],] +Cl1 = [ [ 133.35, 3.46744, 0.0,], [ 4.980261, 5.397754, 4.0,],] +Cl2 = [ [ 133.35, 3.46744, 0.0,], [ 3.615948, 3.234235, 5.476687,],] +Cl3 = [ [ 133.35, 3.46744, 0.0,], [ 4.384052, 3.234235, 2.523313,],] diff --git a/reference/pyrism/data/chloro_cg.toml b/reference/pyrism/data/chloro_cg.toml new file mode 100644 index 00000000..3d00d165 --- /dev/null +++ b/reference/pyrism/data/chloro_cg.toml @@ -0,0 +1,46 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + + + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 4.81 +adbcor = 1.5 + + + +[solvent] +nsv = 5 +nspv = 1 + +[solute] +nsu = 1 +nspu = 1 + +[solvent.chloroform] +dens = 0.00751615 +ns = 5 +H = [ [ 7.9, 2.11286, 0.325656,], [ -1.302348, 0.821262, 0.0,],] +C = [ [ 55.05, 3.39624, -0.425848,], [ -0.384052, 0.242154, 0.0,],] +Cl1 = [ [ 133.35, 3.46744, 0.033397333,], [ 0.980261, 1.397754, 0.0,],] +Cl2 = [ [ 133.35, 3.46744, 0.033397333,], [ -0.384052, -0.765765, 1.476687,],] +Cl3 = [ [ 133.35, 3.46744, 0.033397333,], [ 0.384052, -0.765765, -1.476687,],] + +[solute.chloroform] +dens = 0.0 +ns = 1 +Chlo = [ [ 463.0, 16.0, 0.0,], [ 0.0, 0.0, 0.0,],] diff --git a/reference/pyrism/data/ethene.toml b/reference/pyrism/data/ethene.toml new file mode 100644 index 00000000..2490c82b --- /dev/null +++ b/reference/pyrism/data/ethene.toml @@ -0,0 +1,44 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 1024 +radius = 10.24 +lam = 10 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "Ng" +picard_damping = 0.001 +itermax = 10000 +tol = 1e-12 +diel = 78.497 +adbcor = 0.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 6 +nspu = 1 + +[solvent.water] +dens = 0.033422858685 +ns = 3 +O = [ [ 78.15, 3.16572, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 7.815, 1.16572, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 7.815, 1.16572, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.ethene] +dens = 0.0 +ns = 6 +C = [ [ 43.276879937664646, 1.6998347539724155, -0.21799999999999997,], [ -0.667, 0.0, 0.0,],] +C1 = [ [ 43.276879937664646, 1.6998347539724155, -0.21799999999999997,], [ 0.667, 0.0, 0.0,],] +H = [ [ 7.548293033434298, 1.2998212293675426, 0.10899999999999999,], [ -1.221, -0.929, 0.071,],] +H1 = [ [ 7.548293033434298, 1.2998212293675426, 0.10899999999999999,], [ -1.221, 0.929, -0.071,],] +H2 = [ [ 7.548293033434298, 1.2998212293675426, 0.10899999999999999,], [ 1.221, 0.929, -0.071,],] +H3 = [ [ 7.548293033434298, 1.2998212293675426, 0.10899999999999999,], [ 1.221, -0.929, 0.071,],] diff --git a/reference/pyrism/data/gillan_test.toml b/reference/pyrism/data/gillan_test.toml new file mode 100644 index 00000000..cea7a914 --- /dev/null +++ b/reference/pyrism/data/gillan_test.toml @@ -0,0 +1,57 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 128 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "Gillan" +nbasis = 8 +picard_damping = 0.3 +itermax = 10000 +tol = 1E-12 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 5 +nspv = 3 +[solvent.water] +dens = 3.3274431982198593E-02 +ns = 3 +"O" = [ + [78.15, 3.16571950504, -0.8476], + [0.0, 0.0, 0.0] +] + +"H1" = [ + [7.815, 1.16572, 0.4238], + [1.0, 0.0, 0.0] +] + +"H2" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solvent.na] +dens = 3.0110683E-06 +ns = 1 +"Na" = [ + [1.393909966, 3.32839761097, 1.0], + [0.0, 0.0, 0.0] +] + +[solvent.cl] +dens = 3.0110683E-06 +ns = 1 +"Cl" = [ + [50.32165925, 4.40103966761, -1.0], + [0.0, 0.0, 0.0] +] diff --git a/reference/pyrism/data/nhexylbenzene.toml b/reference/pyrism/data/nhexylbenzene.toml new file mode 100644 index 00000000..79efeaf1 --- /dev/null +++ b/reference/pyrism/data/nhexylbenzene.toml @@ -0,0 +1,69 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +picard_damping = 0.5 +depth = 8 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 30 +nspu = 1 + +[solvent.water] +dens = 0.033422858685 +ns = 3 +O = [ [ 78.15, 3.16572, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 7.815, 1.16572, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 7.815, 1.16572, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.nhexylbenzene] +dens = 0.0 +ns = 30 +C = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 2.288, -0.064, -0.64,],] +C1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0764,], [ 0.897, -0.004, -0.005,],] +C2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 3.387, 0.003, 0.422,],] +C3 = [ [ 55.05221691240736, 1.6998347542253702, -0.037099999999999994,], [ -0.201, -0.036, -1.071,],] +C4 = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 4.777, -0.024, -0.214,],] +C5 = [ [ 43.276879937664646, 1.6998347539724155, -0.0773,], [ -1.576, -0.013, -0.454,],] +C6 = [ [ 55.05221691240736, 1.6998347542253702, -0.0931,], [ 5.871, 0.076, 0.837,],] +C7 = [ [ 43.276879937664646, 1.6998347539724155, -0.128,], [ -2.2, -1.21, -0.135,],] +C8 = [ [ 43.276879937664646, 1.6998347539724155, -0.128,], [ -2.196, 1.205, -0.214,],] +C9 = [ [ 43.276879937664646, 1.6998347539724155, -0.128,], [ -3.473, -1.189, 0.435,],] +C10 = [ [ 43.276879937664646, 1.6998347539724155, -0.128,], [ -3.468, 1.226, 0.357,],] +C11 = [ [ 43.276879937664646, 1.6998347539724155, -0.13299999999999998,], [ -4.107, 0.029, 0.682,],] +H = [ [ 7.900546687705287, 1.324766393630111, 0.0392,], [ 2.39, -0.99, -1.218,],] +H1 = [ [ 7.900546687705287, 1.324766393630111, 0.0392,], [ 2.406, 0.771, -1.342,],] +H2 = [ [ 7.900546687705287, 1.324766393630111, 0.0447,], [ 0.805, 0.911, 0.595,],] +H3 = [ [ 7.900546687705287, 1.324766393630111, 0.0447,], [ 0.774, -0.848, 0.685,],] +H4 = [ [ 7.900546687705287, 1.324766393630111, 0.04019999999999999,], [ 3.282, -0.842, 1.114,],] +H5 = [ [ 7.900546687705287, 1.324766393630111, 0.04019999999999999,], [ 3.272, 0.92, 1.012,],] +H6 = [ [ 7.900546687705287, 1.324766393630111, 0.0477,], [ -0.089, 0.817, -1.753,],] +H7 = [ [ 7.900546687705287, 1.324766393630111, 0.0477,], [ -0.095, -0.932, -1.695,],] +H8 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 4.907, -0.95, -0.785,],] +H9 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 4.88, 0.809, -0.919,],] +H10 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 6.856, 0.054, 0.36,],] +H11 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 5.788, 1.01, 1.402,],] +H12 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 5.816, -0.759, 1.541,],] +H13 = [ [ 7.548293033434298, 1.2998212293675426, 0.1305,], [ -1.714, -2.163, -0.321,],] +H14 = [ [ 7.548293033434298, 1.2998212293675426, 0.1305,], [ -1.706, 2.142, -0.462,],] +H15 = [ [ 7.548293033434298, 1.2998212293675426, 0.12999999999999998,], [ -3.97, -2.121, 0.689,],] +H16 = [ [ 7.548293033434298, 1.2998212293675426, 0.12999999999999998,], [ -3.962, 2.174, 0.549,],] +H17 = [ [ 7.548293033434298, 1.2998212293675426, 0.12999999999999998,], [ -5.097, 0.045, 1.127,],] diff --git a/reference/pyrism/data/nitromethane_resp.toml b/reference/pyrism/data/nitromethane_resp.toml new file mode 100644 index 00000000..f7420859 --- /dev/null +++ b/reference/pyrism/data/nitromethane_resp.toml @@ -0,0 +1,60 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 2048 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 20 +picard_damping = 0.0001 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 7 +nspv = 1 + +[solvent.nitromethane] +dens = 1.1246855E-02 +ns = 7 +"C3" = [ + [55.05, 3.399, -0.3581874554], + [1.31600000e+00, -4.10000000e-02, -0.00000000e+00] +] + +"NO" = [ + [85.55, 3.25, -0.4391993634], + [-1.74000000e-01, -0.00000000e+00, -1.00000000e-03] +] + +"O1" = [ + [105.68, 2.96, 0.1518674752], + [-6.83000000e-01, 1.09600000e+00, 0.00000000e+00] +] + +"O2" = [ + [105.68, 2.96, 0.1518674752], + [-7.66000000e-01, -1.05300000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.9, 2.47, 0.7809828239], + [1.62700000e+00, -1.07800000e+00, -1.60000000e-02] +] + +"H2" = [ + [7.9, 2.47, 0.7809828239], + [1.64600000e+00, 5.05000000e-01, -8.78000000e-01] +] + +"H3" = [ + [7.9, 2.47, 0.7809828239], + [1.64300000e+00, 4.75000000e-01, 8.97000000e-01] +] diff --git a/reference/pyrism/data/nitromethane_resp_wat.toml b/reference/pyrism/data/nitromethane_resp_wat.toml new file mode 100644 index 00000000..65ce465d --- /dev/null +++ b/reference/pyrism/data/nitromethane_resp_wat.toml @@ -0,0 +1,82 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 1024 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 7 +picard_damping = 0.001 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 + "O_w" = [ + [76.48937, 3.15, -0.834], + [0.0, 0.0, 0.0] + ] + + "H1_w" = [ + [23.14810, 0.4, 0.417], + [9.57200000e-01, 0.0, 0.0] + ] + + "H2_w" = [ + [23.14810, 0.4, 0.417], + [-2.39988000e-01, 9.26627000e-01, 0.00000000e+00] + ] + +[solute] +nsu = 7 +nspu = 1 + +[solute.nitromethane] +dens = 1.1246855E-02 +ns = 7 +"C3" = [ + [55.05, 3.399, -0.3581874554], + [1.31600000e+00, -4.10000000e-02, -0.00000000e+00] +] + +"NO" = [ + [85.55, 3.25, -0.4391993634], + [-1.74000000e-01, -0.00000000e+00, -1.00000000e-03] +] + +"O1" = [ + [105.68, 2.96, 0.1518674752], + [-6.83000000e-01, 1.09600000e+00, 0.00000000e+00] +] + +"O2" = [ + [105.68, 2.96, 0.1518674752], + [-7.66000000e-01, -1.05300000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.9, 2.47, 0.7809828239], + [1.62700000e+00, -1.07800000e+00, -1.60000000e-02] +] + +"H2" = [ + [7.9, 2.47, 0.7809828239], + [1.64600000e+00, 5.05000000e-01, -8.78000000e-01] +] + +"H3" = [ + [7.9, 2.47, 0.7809828239], + [1.64300000e+00, 4.75000000e-01, 8.97000000e-01] +] diff --git a/reference/pyrism/data/org_solv.toml b/reference/pyrism/data/org_solv.toml new file mode 100644 index 00000000..c367ca2e --- /dev/null +++ b/reference/pyrism/data/org_solv.toml @@ -0,0 +1,67 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 4.81 +adbcor = 2.5 + +[solvent] +nsv = 5 +nspv = 1 + +[solute] +nsu = 26 +nspu = 1 + +[solvent.chloroform] +dens = 0.00751615 +ns = 5 +H = [ [ 7.9, 2.11286, 0.325656,], [ -1.302348, 0.821262, 0.0,],] +C = [ [ 55.05, 3.39624, -0.425848,], [ -0.384052, 0.242154, 0.0,],] +Cl1 = [ [ 133.35, 3.46744, 0.033397333,], [ 0.980261, 1.397754, 0.0,],] +Cl2 = [ [ 133.35, 3.46744, 0.033397333,], [ -0.384052, -0.765765, 1.476687,],] +Cl3 = [ [ 133.35, 3.46744, 0.033397333,], [ 0.384052, -0.765765, -1.476687,],] + +[solute.0008noc] +dens = 0.0 +ns = 26 +C = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 0.0, 0.762, 0.0,],] +C1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ -0.0, -0.762, 0.0,],] +C2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 1.401, 1.364, 0.0,],] +C3 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ -1.401, -1.364, 0.0,],] +H = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ -0.548, 1.123, 0.876,],] +H1 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ -0.548, 1.123, -0.876,],] +H2 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 0.548, -1.123, 0.876,],] +H3 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 0.548, -1.123, -0.876,],] +C4 = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 1.401, 2.889, 0.0,],] +C5 = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ -1.401, -2.889, 0.0,],] +H4 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 1.95, 1.004, -0.876,],] +H5 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ 1.95, 1.004, 0.876,],] +H6 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ -1.95, -1.004, -0.876,],] +H7 = [ [ 7.900546687705287, 1.324766393630111, 0.0397,], [ -1.95, -1.004, 0.876,],] +C6 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ 2.807, 3.476, 0.0,],] +C7 = [ [ 55.05221691240736, 1.6998347542253702, -0.0921,], [ -2.807, -3.476, 0.0,],] +H8 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 0.851, 3.246, 0.875,],] +H9 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 0.851, 3.246, -0.875,],] +H10 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ -0.851, -3.246, 0.875,],] +H11 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ -0.851, -3.246, -0.875,],] +H12 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 2.788, 4.565, 0.0,],] +H13 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ -2.788, -4.565, 0.0,],] +H14 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 3.363, 3.151, -0.88,],] +H15 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 3.363, 3.151, 0.88,],] +H16 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ -3.363, -3.151, -0.88,],] +H17 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ -3.363, -3.151, 0.88,],] diff --git a/reference/pyrism/data/rust_test.toml b/reference/pyrism/data/rust_test.toml new file mode 100644 index 00000000..8d9e190f --- /dev/null +++ b/reference/pyrism/data/rust_test.toml @@ -0,0 +1,43 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.0019872158728366637 +charge_coeff = 167101.0 +npts = 16384 +radius = 409.6 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 13 +picard_damping = 0.8 +mdiis_damping = 0.8 +itermax = 10000 +tol = 1E-5 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.water] +dens = 0.03334 +ns = 3 +"O" = [ + [78.15, 3.1657, -0.8476000010975563], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.1657, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.1657, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] \ No newline at end of file diff --git a/reference/pyrism/plotter.py b/reference/pyrism/plotter.py new file mode 100644 index 00000000..d8d3ab9b --- /dev/null +++ b/reference/pyrism/plotter.py @@ -0,0 +1,33 @@ +import matplotlib +import matplotlib.pyplot as plt +import pandas as pd +import sys +import numpy as np + + +def plot(): + plt.rcParams["text.usetex"] = False + plt.rcParams["font.size"] = 14 + df = pd.read_csv(sys.argv[1], sep=",", skiprows=[0]) + + r = df.iloc[:, 0].to_numpy() + grs = [] + if sys.argv[2] == "-": + for i in range(1, df.shape[1]): + grs.append((df.columns[i], np.asarray(df.iloc[:, i].to_numpy()))) + else: + for i in sys.argv[2:]: + i = int(i) + grs.append((df.columns[i], np.asarray(df.iloc[:, i].to_numpy()))) + r = np.asarray(r, dtype=np.float64) + + plt.axhline(1, color="grey", linestyle="--", linewidth=2) + plt.xlabel(r"r (Angstrom)") + plt.ylabel(r"g(r)") + plt.xlim([0, 10]) + for gr in grs: + plt.plot(r, gr[1], label=gr[0]) + + plt.legend() + plt.savefig(sys.argv[1] + "_RDF.eps", format="eps") + plt.show() diff --git a/reference/pyrism/rism_ctrl.py b/reference/pyrism/rism_ctrl.py new file mode 100644 index 00000000..a6128e27 --- /dev/null +++ b/reference/pyrism/rism_ctrl.py @@ -0,0 +1,1148 @@ +""" +rism_ctrl.py +A pedagogical implementation of the RISM equations + +Initialises and solves the specified RISM problem. +""" +import os + +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import toml +import sys +from pyrism import Closures +from pyrism import Core +from pyrism import IntegralEquations +from pyrism import Solvers +from pyrism import Potentials +from pyrism import Functionals +from pyrism import Util +from numba import njit, jit, prange +import time +import warnings +from pyrism.librism import RISMDriver +from dataclasses import dataclass, field +from enum import Enum + + +np.seterr(over="raise") +np.set_printoptions(precision=20) +warnings.simplefilter(action="ignore", category=pd.errors.PerformanceWarning) + + +@dataclass +class GillanSettings: + nbasis: int + + +@dataclass +class MDIISSettings: + depth: int + damping: float + + +@dataclass +class SolverSettings: + picard_damping: float + max_iter: int + tolerance: float + gillan_settings: object = None + mdiis_settings: object = None + + +@dataclass +class SolverConfig: + solver: str + settings: object + + +@dataclass +class DataConfig: + temp: float + kt: float + ku: float + amph: float + drism_damping: float + dielec: float + nsv: int + nsu: int + nspv: int + nspu: int + npts: int + radius: float + nlambda: int + preconverged: str + solvent_atoms: list = field(default_factory=list) + solute_atoms: list = field(default_factory=list) + solvent_species: list = field(default_factory=list) + solute_species: list = field(default_factory=list) + + +@dataclass +class OperatorConfig: + integral_equation: str + closure: str + + +@dataclass +class PotentialConfig: + nonbonded: str + coulombic: str + renormalisation_real: str + renormalisation_fourier: str + + +@dataclass +class RismController: + """Initialises the parameters for the problem and starts the solver + + Attributes + ---------- + fname : str + Path to input file + name : str + Name of current RISM job (defaults to the file name) + uv_check : bool + Checks if a solute-solvent problem requires solving + vv : Core.RISM_Obj + Dataclass for parameters in solvent-solvent problem + uv : Core.RISM_Obj + Dataclass for parameters in solute-solvent problem + solver : Solvers.Solver + Dispatcher object to initialise solvent-solvent solver + solver_UV : Solvers.Solver + Dispatcher object to initialise solute-solvent solver + closure : Closures.Closure + Dispatcher object to initialise closures + IE : IntegralEquations.IntegralEquation + Dispatcher object to initialise solvent-solvent integral equation + IE_UV : IntegralEquations.IntegralEquation + Dispatcher object to initialise solute-solvent integral equation + """ + + fname: str + name: str = field(init=False) + uv_check: bool = field(init=False, default=False) + vv: Core.RISM_Obj = field(init=False) + uv: Core.RISM_Obj = field(init=False) + pot: Potentials.Potential = field(init=False) + solver: Solvers.Solver = field(init=False) + solver_UV: Solvers.Solver = field(init=False) + closure: Closures.Closure = field(init=False) + IE: IntegralEquations.IntegralEquation = field(init=False) + SFED: dict = field(init=False, default_factory=dict) + SFE: dict = field(init=False, default_factory=dict) + + def initialise_controller(self): + """Reads input file `fname` to create `vv` and `uv` and + builds the intra""" + self.read_input() + self.build_wk(self.vv) + self.build_rho(self.vv) + # Assuming infinite dilution, uv doesn't need p. Giving it vv's p makes later calculations easier + if self.uv_check: + self.uv.p = self.vv.p + self.build_wk(self.uv) + + def do_rism(self, verbose=False): + """Solves the vv and uv (if applicable) problems and outputs the results""" + if self.uv_check: + self.solve(self.vv, dat2=self.uv, verbose=verbose) + else: + self.solve(self.vv, dat2=None, verbose=verbose) + + def write_csv_driver(self, df, fname, ext): + """Writes a dataframe to a .csv file with a header + + Parameters + ---------- + df: pd.DataFrame + Contains the functions to write to file + fname: str + Name of output file + ext: str + Extension of output file + p: float + Number density + T: float + Temperature""" + with open(fname + ext, "w") as ofile: + ofile.write("#\n") + df.to_csv(ofile, index=False, header=True, mode="a") + + def write_solv(self, name, atoms1, atoms2, solution, r): + """Write solvent-solvent data to .csv file + + Parameters + ---------- + dat: Core.RISM_Obj + Dataclass containing correlation functions to output + """ + all_sites = [] + gr = pd.DataFrame(r, columns=["r"]) + cr = pd.DataFrame(r, columns=["r"]) + tr = pd.DataFrame(r, columns=["r"]) + for i, j in np.ndindex(len(atoms1), len(atoms2)): + lbl1 = atoms1[i].atom_type + lbl2 = atoms2[j].atom_type + gr[lbl1 + "-" + lbl2] = solution.correlations.gr[:, i, j] + cr[lbl1 + "-" + lbl2] = solution.correlations.cr[:, i, j] + tr[lbl1 + "-" + lbl2] = solution.correlations.tr[:, i, j] + self.write_csv_driver(gr, name, "_driver.gvv") + self.write_csv_driver(cr, name, "_driver.cvv") + self.write_csv_driver(tr, name, "_driver.tvv") + + def write_solu(self, name, atoms1, atoms2, solution, r): + """Write solvent-solvent data to .csv file + + Parameters + ---------- + dat: Core.RISM_Obj + Dataclass containing correlation functions to output + """ + all_sites = [] + gr = pd.DataFrame(r, columns=["r"]) + cr = pd.DataFrame(r, columns=["r"]) + tr = pd.DataFrame(r, columns=["r"]) + for i, j in np.ndindex(len(atoms1), len(atoms2)): + lbl1 = atoms1[i].atom_type + lbl2 = atoms2[j].atom_type + gr[lbl1 + "-" + lbl2] = solution.correlations.gr[:, i, j] + cr[lbl1 + "-" + lbl2] = solution.correlations.cr[:, i, j] + tr[lbl1 + "-" + lbl2] = solution.correlations.tr[:, i, j] + self.write_csv_driver(gr, name, "_driver.guv") + self.write_csv_driver(cr, name, "_driver.cuv") + self.write_csv_driver(tr, name, "_driver.tuv") + + def read_input(self): + """Reads .toml input file, populates vv and uv dataclasses + and properly initialises the appropriate potentials, solvers, + closures, and integral equations""" + inp = toml.load(self.fname) + name = os.path.basename(self.fname).split(sep=".")[0] + if "solvent" not in inp: + raise ("no solvent data in input .toml file") + + temp = inp["system"]["temp"] + kt = inp["system"]["kT"] + ku = inp["system"]["kU"] + amph = inp["system"]["charge_coeff"] + drism_damping = None + dielec = None + if inp["params"]["IE"] == "DRISM": + drism_damping = inp["params"]["adbcor"] + dielec = inp["params"]["diel"] + nsv = inp["solvent"]["nsv"] + nsu = None + nspv = inp["solvent"]["nspv"] + nspu = None + npts = inp["system"]["npts"] + radius = inp["system"]["radius"] + lam = inp["system"]["lam"] + preconv = None + if "preconverged" in inp["solvent"]: + preconv = inp["solvent"]["preconverged"] + solv_atoms, solv_species = self.add_species_to_list( + list( + { + k: inp["solvent"][k] + for k in inp["solvent"].keys() - {"nsv", "nspv"} + }.items() + ) + ) + solu_atoms = None + solu_species = None + if "solute" in inp: + nsu = inp["solute"]["nsu"] + nspu = inp["solute"]["nspu"] + solu_atoms, solu_species = self.add_species_to_list( + list( + { + k: inp["solute"][k] + for k in inp["solute"].keys() - {"nsu", "nspu"} + }.items() + ) + ) + data_config = DataConfig( + temp, + kt, + ku, + amph, + drism_damping, + dielec, + nsv, + nsu, + nspv, + nspu, + npts, + radius, + lam, + preconv, + solv_atoms, + solu_atoms, + solv_species, + solu_species, + ) + operator_config = OperatorConfig(inp["params"]["IE"], inp["params"]["closure"]) + + potential_config = PotentialConfig( + inp["params"]["potential"], "COU", "NGR", "NGK" + ) + + solver = inp["params"]["solver"] + picard_damping = inp["params"]["picard_damping"] + max_iter = inp["params"]["itermax"] + tolerance = inp["params"]["tol"] + mdiis_settings = gillan_settings = None + if solver == "MDIIS": + if "mdiis_settings" not in inp["params"]: + mdiis_settings = MDIISSettings( + inp["params"]["depth"], inp["params"]["picard_damping"] + ) + else: + mdiis_settings = MDIISSettings( + inp["params"]["depth"], inp["params"]["mdiis_damping"] + ) + elif solver == "Gillan": + gillan_settings = GillanSettings(inp["params"]["nbasis"]) + + settings = SolverSettings( + picard_damping, + max_iter, + tolerance, + gillan_settings=gillan_settings, + mdiis_settings=mdiis_settings, + ) + + solver_config = SolverConfig(solver, settings) + + # rism_job = RISMDriver( + # name, data_config, operator_config, potential_config, solver_config + # ) + # solutions = rism_job.do_rism("quiet", False) + # + # grid = Core.Grid(data_config.npts, data_config.radius) + # + # self.write_solv( + # name, + # data_config.solvent_atoms, + # data_config.solvent_atoms, + # solutions.vv, + # grid.ri, + # ) # literature route + # + # if solutions.uv: + # self.write_solu( + # name, + # data_config.solute_atoms, + # data_config.solvent_atoms, + # solutions.uv, + # grid.ri, + # ) + # + self.name = os.path.basename(self.fname).split(sep=".")[0] + if "solvent" not in inp: + raise ("No solvent data found!") + else: + self.vv = Core.RISM_Obj( + inp["system"]["temp"], + inp["system"]["kT"], + inp["system"]["kU"], + inp["system"]["charge_coeff"], + inp["solvent"]["nsv"], + inp["solvent"]["nsv"], + inp["solvent"]["nspv"], + inp["solvent"]["nspv"], + inp["system"]["npts"], + inp["system"]["radius"], + inp["system"]["lam"], + ) + solv_species = list(inp["solvent"].items())[2 : self.vv.nsp1 + 2] + for i in solv_species: + self.add_species(i, self.vv) + + if "solute" in inp: + self.uv = Core.RISM_Obj( + inp["system"]["temp"], + inp["system"]["kT"], + inp["system"]["kU"], + inp["system"]["charge_coeff"], + inp["solute"]["nsu"], + inp["solvent"]["nsv"], + inp["solvent"]["nspv"], + inp["solute"]["nspu"], + inp["system"]["npts"], + inp["system"]["radius"], + inp["system"]["lam"], + ) + self.uv_check = True + solu_species = list(inp["solute"].items())[2 : self.uv.nsp1 + 2] + for i in solu_species: + self.add_species(i, self.uv) + + self.pot = Potentials.Potential(inp["params"]["potential"]) + + self.closure = Closures.Closure(inp["params"]["closure"]) + + if inp["params"]["IE"] == "DRISM": + IE = IntegralEquations.IntegralEquation(inp["params"]["IE"]).get_IE() + if Util.total_moment(self.vv) is not None: + Util.align_dipole(self.vv) + else: + print("No solvent dipole moment") + if self.uv_check: + if Util.total_moment(self.uv) is not None: + Util.align_dipole(self.uv) + else: + print("No dipole moment, skipping alignment step...") + if self.uv_check: + self.IE = IE( + self.vv, inp["params"]["diel"], inp["params"]["adbcor"], self.uv + ) + else: + self.IE = IE(self.vv, inp["params"]["diel"], inp["params"]["adbcor"]) + elif inp["params"]["IE"] == "XRISM-DB": + IE = IntegralEquations.IntegralEquation(inp["params"]["IE"]).get_IE() + if self.uv_check: + self.IE = IE(inp["params"]["B"], self.vv, self.uv) + else: + self.IE = IE(inp["params"]["B"], self.vv) + self.closure = Closures.Closure("r" + inp["params"]["closure"]) + else: + IE = IntegralEquations.IntegralEquation(inp["params"]["IE"]).get_IE() + if self.uv_check: + self.IE = IE(self.vv, self.uv) + else: + self.IE = IE(self.vv) + + slv = Solvers.Solver(inp["params"]["solver"]).get_solver() + slv = Solvers.Solver(inp["params"]["solver"]).get_solver() + if inp["params"]["solver"] == "MDIIS": + if "mdiis_damping" in inp["params"]: + self.solver = slv( + self.vv, + inp["params"]["tol"], + inp["params"]["itermax"], + inp["params"]["picard_damping"], + m=inp["params"]["depth"], + mdiis_damping=inp["params"]["mdiis_damping"], + ) + if self.uv_check: + slv_uv = Solvers.Solver(inp["params"]["solver"]).get_solver() + self.solver_UV = slv_uv( + self.vv, + inp["params"]["tol"], + inp["params"]["itermax"], + inp["params"]["picard_damping"], + data_uv=self.uv, + m=inp["params"]["depth"], + mdiis_damping=inp["params"]["mdiis_damping"], + ) + + else: + self.solver = slv( + self.vv, + inp["params"]["tol"], + inp["params"]["itermax"], + inp["params"]["picard_damping"], + m=inp["params"]["depth"], + mdiis_damping=inp["params"]["picard_damping"], + ) + if self.uv_check: + slv_uv = Solvers.Solver(inp["params"]["solver"]).get_solver() + self.solver_UV = slv_uv( + self.vv, + inp["params"]["tol"], + inp["params"]["itermax"], + inp["params"]["picard_damping"], + data_uv=self.uv, + m=inp["params"]["depth"], + ) + elif inp["params"]["solver"] == "Gillan": + self.solver = slv( + self.vv, + inp["params"]["tol"], + inp["params"]["itermax"], + inp["params"]["picard_damping"], + nbasis=inp["params"]["nbasis"], + ) + if self.uv_check: + slv_uv = Solvers.Solver(inp["params"]["solver"]).get_solver() + self.solver_UV = slv_uv( + self.vv, + inp["params"]["tol"], + inp["params"]["itermax"], + inp["params"]["picard_damping"], + data_uv=self.uv, + nbasis=inp["params"]["nbasis"], + ) + else: + self.solver = slv( + self.vv, + inp["params"]["tol"], + inp["params"]["itermax"], + inp["params"]["picard_damping"], + ) + if self.uv_check: + slv_uv = Solvers.Solver(inp["params"]["solver"]).get_solver() + self.solver_UV = slv_uv( + self.vv, + inp["params"]["tol"], + inp["params"]["itermax"], + inp["params"]["picard_damping"], + data_uv=self.uv, + ) + + def add_species_to_list(self, solv_species): + """Parses interaction sites and assigns them to relevant species + + Parameters + ---------- + spec_dat: List + Contains information on the current species pulled from the .toml file + data_object: Core.RISM_Obj + The dataclass to which species are being assigned + """ + atom_list = [] + species_list = [] + for spec_dat in solv_species: + new_spec = Core.Species(spec_dat[0]) + spdict = spec_dat[1] + new_spec.set_density(spdict["dens"]) + new_spec.set_numsites(spdict["ns"]) + site_info = list(spdict.items())[2 : new_spec.ns + 2] + for i in site_info: + atom = Core.Site(i[0], i[1][0], np.asarray(i[1][1])) + new_spec.add_site(atom) + atom_list.append(atom) + species_list.append(new_spec) + + return (atom_list, species_list) + + def add_species(self, spec_dat, data_object): + """Parses interaction sites and assigns them to relevant species + + Parameters + ---------- + spec_dat: List + Contains information on the current species pulled from the .toml file + data_object: Core.RISM_Obj + The dataclass to which species are being assigned + """ + new_spec = Core.Species(spec_dat[0]) + spdict = spec_dat[1] + new_spec.set_density(spdict["dens"]) + new_spec.set_numsites(spdict["ns"]) + site_info = list(spdict.items())[2 : new_spec.ns + 2] + for i in site_info: + atom = Core.Site(i[0], i[1][0], np.asarray(i[1][1])) + new_spec.add_site(atom) + data_object.atoms.append(atom) + data_object.species.append(new_spec) + + def distance_mat(self, dat): + """Computes the Euclidean distance matrix while + skipping distances between different sites of + different species + + Parameters + ---------- + dat: Core.RISM_Obj + Dataclass containing information required for distance matrix + + Returns + ------- + distance_arr: np.ndarray + nD-Array with distances between atomic sites""" + distance_arr = np.zeros((dat.ns1, dat.ns1), dtype=float) + i = 0 + for isp in dat.species: + for iat in isp.atom_sites: + j = 0 + for jsp in dat.species: + for jat in jsp.atom_sites: + if isp != jsp: + distance_arr[i, j] = -1 + else: + distance_arr[i, j] = np.linalg.norm(iat.coords - jat.coords) + j += 1 + i += 1 + return distance_arr + + def build_wk(self, dat): + """Computes intramolecular correlation matrix in k-space for sites in same species + + Parameters + ---------- + dat: Core.RISM_Obj + Dataclass containing information required for intramolecular correlation + + Notes + ----- + Calculated directly in k-space because not required in r-space: + + .. math:: \\omega(k) = \\frac{kl}{sin(kl)} + """ + I = np.ones(dat.npts, dtype=np.float64) + zero_vec = np.zeros(dat.npts, dtype=np.float64) + dist_mat = self.distance_mat(dat) + for i, j in np.ndindex(dat.ns1, dat.ns1): + if dist_mat[i, j] < 0.0: + dat.w[:, i, j] = zero_vec + elif dist_mat[i, j] == 0.0: + dat.w[:, i, j] = I + else: + dat.w[:, i, j] = np.sin(dat.grid.ki * dist_mat[i, j]) / ( + dat.grid.ki * dist_mat[i, j] + ) + + def build_Ur(self, dat1, dat2, lam=1): + """Tabulates full short-range and Coulombic potential + + Parameters + ---------- + dat1: Core.RISM_Obj + Dataclass containing information required for potential + dat2: Core.RISM_Obj + Dataclass containing information required for potential + lam: float + :math: `\lambda` parameter for current charging cycle + + Notes + ----- + For solvent-solvent problem `dat1` and `dat2` are the same, + for the solute-solvent problem they both refer to the solvent + and solute dataclasses respectively.""" + + sr_pot, mix = self.pot.get_potential() + cou, _ = Potentials.Potential("cou").get_potential() + # dat1.u = build_Ur_impl(dat1.npts, + # dat1.ns1, + # dat1.ns2, + # sr_pot, + # mix, + # cou, + # dat1.atoms, + # dat2.atoms, + # dat2.grid.ri, + # dat2.amph) + for i, iat in enumerate(dat1.atoms): + for j, jat in enumerate(dat2.atoms): + i_sr_params = iat.params[:-1] + j_sr_params = jat.params[:-1] + qi = iat.params[-1] + qj = jat.params[-1] + if iat is jat: + dat1.u[:, i, j] = sr_pot(dat2.grid.ri, i_sr_params, lam) + cou( + dat2.grid.ri, qi, qj, lam, dat2.amph + ) + else: + mixed = mix(i_sr_params, j_sr_params) + dat1.u[:, i, j] = sr_pot(dat2.grid.ri, mixed, lam) + cou( + dat2.grid.ri, qi, qj, lam, dat2.amph + ) + + def build_renorm(self, dat1, dat2, damping=1.0, lam=1): + """Tabulates full short-range and Coulombic potential + + Parameters + ---------- + dat1: Core.RISM_Obj + Dataclass containing information required for potential + dat2: Core.RISM_Obj + Dataclass containing information required for potential + damping: float + damping parameter for adding a screened charge + lam: float + :math: `\lambda` parameter for current charging cycle + + Notes + ----- + For solvent-solvent problem `dat1` and `dat2` are the same, + for the solute-solvent problem they both refer to the solvent + and solute dataclasses respectively.""" + erfr, _ = Potentials.Potential("erfr").get_potential() + erfk, _ = Potentials.Potential("erfk").get_potential() + for i, iat in enumerate(dat1.atoms): + for j, jat in enumerate(dat2.atoms): + qi = iat.params[-1] + qj = jat.params[-1] + dat1.ur_lr[:, i, j] = erfr( + dat2.grid.ri, qi, qj, damping, 1.0, lam, dat2.amph + ) + dat1.uk_lr[:, i, j] = erfk( + dat2.grid.ki, qi, qj, damping, lam, dat2.amph + ) + + def build_rho(self, dat): + """Builds diagonal matrix of species densities + + Parameters + ---------- + dat: Core.RISM_Obj + Dataclass containing species information + """ + dens = [] + for isp in dat.species: + for iat in isp.atom_sites: + dens.append(isp.dens) + dat.p = np.diag(dens) + + def write_csv(self, df, fname, ext, p, T, SFE=None): + """Writes a dataframe to a .csv file with a header + + Parameters + ---------- + df: pd.DataFrame + Contains the functions to write to file + fname: str + Name of output file + ext: str + Extension of output file + p: float + Number density + T: float + Temperature""" + with open(fname + ext, "w") as ofile: + if SFE is not None: + ofile.write( + "# density: {p}, temp: {T}, HNC: {HNC}, GF: {GF}, KH: {KH}, PW: {PW}, PC+: {PC_PLUS}\n".format( + p=p[0][0], + T=T, + HNC=SFE["HNC"], + GF=SFE["GF"], + KH=SFE["KH"], + PW=SFE["PW"], + PC_PLUS=SFE["PC+"], + ) + ) + else: + ofile.write("# density: {p}, temp: {T}\n".format(p=p[0][0], T=T)) + df.to_csv(ofile, index=False, header=True, mode="a") + + def write_vv(self, dat): + """Write solvent-solvent data to .csv file + + Parameters + ---------- + dat: Core.RISM_Obj + Dataclass containing correlation functions to output + """ + all_sites = [] + for species in dat.species: + for site in species.atom_sites: + all_sites.append(site) + gr = pd.DataFrame(dat.grid.ri, columns=["r"]) + cr = pd.DataFrame(dat.grid.ri, columns=["r"]) + tr = pd.DataFrame(dat.grid.ri, columns=["r"]) + for i, j in np.ndindex(dat.ns1, dat.ns2): + lbl1 = all_sites[i].atom_type + lbl2 = all_sites[j].atom_type + gr[lbl1 + "-" + lbl2] = dat.g[:, i, j] + cr[lbl1 + "-" + lbl2] = dat.c[:, i, j] + tr[lbl1 + "-" + lbl2] = dat.t[:, i, j] + self.write_csv(gr, self.name, ".gvv", dat.p, dat.T) + self.write_csv(cr, self.name, ".cvv", dat.p, dat.T) + self.write_csv(tr, self.name, ".tvv", dat.p, dat.T) + + def write_uv(self, vv, uv): + """Write solute-solvent data to .csv file + + Parameters + ---------- + dat: Core.RISM_Obj + Dataclass containing correlation functions to output + """ + gr = pd.DataFrame(uv.grid.ri, columns=["r"]) + cr = pd.DataFrame(uv.grid.ri, columns=["r"]) + tr = pd.DataFrame(uv.grid.ri, columns=["r"]) + dr = pd.DataFrame(uv.grid.ri, columns=["r"]) + d_GFr = pd.DataFrame(uv.grid.ri, columns=["r"]) + for i, iat in enumerate(uv.atoms): + for j, jat in enumerate(vv.atoms): + lbl1 = iat.atom_type + lbl2 = jat.atom_type + gr[lbl1 + "-" + lbl2] = uv.g[:, i, j] + cr[lbl1 + "-" + lbl2] = uv.c[:, i, j] + tr[lbl1 + "-" + lbl2] = uv.t[:, i, j] + self.write_csv(gr, self.name, ".guv", uv.p, uv.T) + self.write_csv(cr, self.name, ".cuv", uv.p, uv.T) + self.write_csv(tr, self.name, ".tuv", uv.p, uv.T) + + def write_output(self, duv_only=False): + if duv_only and self.uv_check: + self.SFED_write(self.uv.grid.ri, self.SFED, self.SFE, self.uv.p, self.uv.T) + elif self.uv_check: + self.write_vv(self.vv) + self.write_uv(self.vv, self.uv) + self.SFED_write(self.uv.grid.ri, self.SFED, self.SFE, self.uv.p, self.uv.T) + else: + self.write_vv(self.vv) + + def solve(self, dat1, dat2=None, verbose=False): + """Start solving RISM problem + + Parameters + ---------- + dat1: Core.RISM_Obj + Dataclass containing all information for problem + dat2: Core.RISM_Obj, optional + Dataclass containing all information for problem + + Notes + ----- + If `dat2` is not defined, the solvent-solvent problem is being solved. + With `dat2`, the solute-solvent is solved. + """ + fvv = np.exp(-dat1.B * dat1.u_sr) - 1.0 + if verbose == True: + output_str = """\n-- pyRISM --\nRunning: {name},\nTemperature: {T},\nSolvent Density: {p}\nMethod: {IE}\nClosure: {clos}\nPotential: {pot}, + """.format( + name=self.name, + T=str(dat1.T), + p=str(dat1.p[0][0]), + IE=self.IE.__class__.__name__, + clos=self.closure.get_closure().__name__, + pot=self.pot.get_potential()[0].__name__, + ) + print(output_str) + if self.uv_check: + fuv = np.exp(-dat2.B * dat2.u_sr) - 1.0 + for j in range(1, dat1.nlam + 1): + lam = 1.0 * j / dat1.nlam + if j == 1: + dat1.c = np.zeros_like(dat1.ur_lr) + if self.uv_check: + dat2.c = np.zeros_like(dat2.ur_lr) + else: + pass + + self.build_Ur(dat1, dat1, lam) + self.build_renorm(dat1, dat1, 1.0, lam) + dat1.u_sr = dat1.u - dat1.ur_lr + # rustrism = RISMDriver( + # dat1.T, + # dat1.kT, + # dat1.amph, + # dat1.ns1, + # dat1.ns2, + # dat1.npts, + # dat1.radius, + # dat1.nlam, + # dat1.u, + # dat1.u_sr, + # dat1.ur_lr, + # dat1.uk_lr, + # dat1.w, + # dat1.p, + # self.solver.m, + # self.solver.mdiis_damping, + # self.solver.damp_picard, + # self.solver.max_iter, + # self.solver.tol, + # ) + # rustrism.do_rism() + self.solve_vv(lam, verbose) + # dat1.c, dat1.t, dat1.h, dat1.h_k = rustrism.extract() + if self.uv_check: + self.build_Ur(dat2, dat1, lam) + self.build_renorm(dat2, dat1, 1.0, lam) + dat2.u_sr = dat2.u - dat2.ur_lr + self.solve_uv(lam, verbose) + + self.epilogue(dat1, dat2) + + def solve_uv(self, lam, verbose=False): + """Call closure and integral equation functions and start solute-solvent solver + + Parameters + ---------- + lam: float + :math: `\\lambda` parameter for current charging cycle + """ + clos = self.closure.get_closure() + IE = self.IE.compute_uv + self.solver_UV.solve_uv(IE, clos, lam, verbose) + + def solve_vv(self, lam, verbose=False): + """Call closure and integral equation functions and start solvent-solvent solver + + Parameters + ---------- + lam: float + :math: `\\lambda` parameter for current charging cycle + """ + clos = self.closure.get_closure() + IE = self.IE.compute_vv + self.solver.solve(IE, clos, lam, verbose) + + def integrate(self, SFE, dr): + return dr * np.sum(SFE) + + def SFED_write(self, r, SFEDs, SFEs, p, T): + dr = pd.DataFrame(r, columns=["r"]) + for SFED_key in SFEDs: + dr[SFED_key] = SFEDs[SFED_key] + self.write_csv(dr, self.name + "_SFED", ".duv", p, T, SFE=SFEs) + + def SFED_calc(self, dat2, vv=None): + SFED_HNC = Functionals.Functional("HNC").get_functional()(dat2, vv) + SFED_KH = Functionals.Functional("KH").get_functional()(dat2, vv) + SFED_GF = Functionals.Functional("GF").get_functional()(dat2, vv) + SFED_SC = Functionals.Functional("SC").get_functional()(dat2, vv) + SFED_PW = Functionals.Functional("PW").get_functional()(dat2, vv) + # SFED_RBC = Functionals.Functional("RBC").get_functional()(dat2, vv) + + SFE_HNC = self.integrate(SFED_HNC, dat2.grid.d_r) + SFE_KH = self.integrate(SFED_KH, dat2.grid.d_r) + SFE_GF = self.integrate(SFED_GF, dat2.grid.d_r) + SFE_SC = self.integrate(SFED_SC, dat2.grid.d_r) + SFE_PW = self.integrate(SFED_PW, dat2.grid.d_r) + # SFE_RBC = self.integrate(SFED_RBC, dat2.grid.d_r) + + # SFE_text = "\n{clos_name}: {SFE_val} kcal/mol" + + # print(SFE_text.format(clos_name="KH", SFE_val=SFE_KH)) + # print(SFE_text.format(clos_name="HNC", SFE_val=SFE_HNC)) + # print(SFE_text.format(clos_name="GF", SFE_val=SFE_GF)) + + self.SFED = { + "HNC": SFED_HNC, + "KH": SFED_KH, + "GF": SFED_GF, + "SC": SFED_SC, + "PW": SFED_PW, + } + self.SFE = { + "HNC": SFE_HNC, + "KH": SFE_KH, + "GF": SFE_GF, + "SC": SFE_SC, + "PW": SFE_PW, + } + + SFE_PC_PLUS = self.pc_plus() + self.SFE["PC+"] = SFE_PC_PLUS + + def epilogue(self, dat1, dat2=None): + """Computes final total, direct and pair correlation functions + + Parameters + ---------- + dat1: Core.RISM_Obj + Dataclass containing all information for final functions + dat2: Core.RISM_Obj, optional + Dataclass containing all information for final functions + """ + + dat1.c -= dat1.B * dat1.ur_lr + dat1.t += dat1.B * dat1.ur_lr + dat1.g = 1.0 + dat1.c + dat1.t + dat1.h = dat1.t + dat1.c + + if self.uv_check: + dat2.c -= dat2.B * dat2.ur_lr + dat2.t += dat2.B * dat2.ur_lr + dat2.g = 1.0 + dat2.c + dat2.t + dat2.h = dat2.t + dat2.c + self.SFED_calc(dat2, vv=dat1) + + def isothermal_compressibility(self, dat): + # WIP + ck = np.zeros((dat.npts, dat.ns1, dat.ns2), dtype=np.float64) + + ck = dat.grid.dht(dat.c) + + # Amber route to isothermal compressibility + ck0 = 0.0 + for i in range(dat.grid.npts): + ck0r = 0.0 + for j in range(0, dat.ns1): + for k in range(j, dat.ns2): + if j == k: + msym = 1.0 + else: + msym = 2.0 + ck0r += ( + msym * np.diag(dat.p)[j] * np.diag(dat.p)[k] * dat.c[i, j, k] + ) + ck0 += ck0r * dat.grid.ri[i] ** 2.0 + ck0 *= 4.0 * np.pi * dat.grid.d_r + + r = self.vv.grid.ri[:, np.newaxis, np.newaxis] + ck0 = self.integrate(self.vv.c * r * r, 4.0 * np.pi * self.vv.grid.d_r) + + # literature route + pck = np.sum(ck[0, ...]) * dat.p[0][0] + p = dat.p[0][0] + + B = 1.0 / dat.T / 1.380658e-23 + + # return ( 1.0 / ((dat.p[0][0] - ck0)) , 1.0 / (p * (1.0 - pck))) + return 1.0 / (p * (1.0 - pck)) + # return 1.0 / ((dat.p[0][0] - ck0)) + + def kb_partial_molar_volume(self): + uv = self.uv + vv = self.vv + + ck = np.zeros((uv.npts, uv.ns1, uv.ns2), dtype=np.float64) + hk_vv = np.zeros((vv.npts, vv.ns1, vv.ns2), dtype=np.float64) + hk_uv = np.zeros((uv.npts, uv.ns1, uv.ns2), dtype=np.float64) + + hk_vv = vv.grid.dht((vv.t + vv.c)) + + ck = uv.grid.dht(uv.c) + hk_uv = uv.grid.dht((uv.t + uv.c)) + # hk_vv = self.vv.h_k + # hk_uv = self.uv.h_k + + compres = self.isothermal_compressibility(self.vv) + + r = self.uv.grid.ri[:, np.newaxis, np.newaxis] + ck0 = self.integrate(self.uv.c * r * r, 4.0 * np.pi * self.uv.grid.d_r) + rhvv = self.integrate(self.vv.h * r * r, 4.0 * np.pi * self.uv.grid.d_r) + rhuv = self.integrate(self.uv.h * r * r, 4.0 * np.pi * self.uv.grid.d_r) + khvv = np.sum(hk_vv[0, ...]) + khuv = np.sum(hk_uv[0, ...]) + pv = self.vv.p[0][0] + pvec = np.diag(self.vv.p) + + inv_B = self.uv.kT * self.uv.T + ck0_direct = np.sum(ck[0, ...] @ self.vv.p) + + return (1.0 / pv) + (khvv - khuv) / self.uv.ns1 + + def rism_kb_partial_molar_volume(self): + uv = self.uv + + ck = np.zeros((uv.npts, uv.ns1, uv.ns2), dtype=np.float64) + hk = np.zeros((uv.npts, uv.ns1, uv.ns2), dtype=np.float64) + + ck = uv.grid.dht(uv.c) + hk = self.uv.h_k + + compres = self.isothermal_compressibility(self.vv) + + r = self.uv.grid.ri[:, np.newaxis, np.newaxis] + ck0 = self.integrate(self.uv.c * r * r, 4.0 * np.pi * self.uv.grid.d_r) + rhvv = self.integrate(self.vv.h * r * r, 4.0 * np.pi * self.uv.grid.d_r) + rhuv = self.integrate(self.uv.h * r * r, 4.0 * np.pi * self.uv.grid.d_r) + khvv = np.sum(hk[0, 0, 0]) + khuv = np.sum(hk[0, :, 0]) + pv = self.vv.p[0][0] + pvec = np.diag(self.vv.p) + + inv_B = self.uv.kT * self.uv.T + ck0_direct = np.sum(ck[0, ...]) + + return compres * (1.0 - pv * ck0_direct) + + # return (1.0 / pv) + khvv - khuv / self.uv.ns1 + + def dimensionless_pmv(self): + pmv = self.kb_partial_molar_volume() + + return self.uv.p[0][0] * pmv + + def pc_plus(self): + pc, pcplus = self.pressure() + pmv = self.kb_partial_molar_volume() + + if self.closure.get_closure().__name__ == "HyperNetted_Chain": + keystr = "HNC" + elif self.closure.get_closure().__name__ == "KovalenkoHirata": + keystr = "KH" + else: + keystr = "GF" + + return self.SFE[keystr] - (pcplus * pmv) + + def __virial_pressure(self): + # WIP + duvv = np.zeros_like(self.vv.u) + + for i, j in np.ndindex(self.vv.ns1, self.vv.ns2): + grad = np.gradient(self.vv.u[:, i, j], self.vv.grid.d_r) + duvv[:, i, j] = grad + + pressure = (self.vv.g @ duvv) * np.power(self.uv.grid.ri, 3)[ + :, np.newaxis, np.newaxis + ] + + return ( + self.vv.kT * self.vv.T * np.sum(self.vv.p) + ) - self.vv.grid.d_r * 2.0 / 3.0 * np.pi * np.power( + np.sum(self.vv.p), 2 + ) * np.sum( + pressure + ) + + def pressure(self): + uv = self.vv + nu = uv.ns1 + nv = uv.ns2 + + p0 = uv.p[0][0] + + B = 1.0 / uv.T / 1.380658e-23 + + inv_B = uv.T * 1.380658e-23 + + inv_py_B = 1.0 / uv.B + + ck = np.zeros((uv.npts, uv.ns1, uv.ns2), dtype=np.float64) + + ck = uv.grid.dht(uv.c) + + compres = self.isothermal_compressibility(uv) + + initial_term = ((nu + 1.0) / 2.0) * (uv.kU * uv.T) * p0 + + ck_direct = np.sum(uv.p @ uv.p @ ck[0, ...]) + + ck_compres = np.power(p0, 2) * (1.0 - (uv.B / compres)) + + pressure = np.sum(initial_term) - ((uv.kU * uv.T) / 2.0) * ck_direct + + ideal_pressure = p0 * uv.kU * uv.T + + return pressure, pressure - ideal_pressure + + +@jit +def build_Ur_impl( + npts, ns1, ns2, sr_pot, mix, cou, atoms1, atoms2, r, charge_coeff, lam=1 +): + """Tabulates full short-range and Coulombic potential + + Parameters + ---------- + dat1: Core.RISM_Obj + Dataclass containing information required for potential + dat2: Core.RISM_Obj + Dataclass containing information required for potential + lam: float + :math: `\lambda` parameter for current charging cycle + + Notes + ----- + For solvent-solvent problem `dat1` and `dat2` are the same, + for the solute-solvent problem they both refer to the solvent + and solute dataclasses respectively.""" + u = np.zeros((npts, ns1, ns2), dtype=np.float64) + for i, iat in enumerate(atoms1): + for j, jat in enumerate(atoms2): + i_sr_params = iat.params[:-1] + j_sr_params = jat.params[:-1] + qi = iat.params[-1] + qj = jat.params[-1] + if iat == jat: + u[:, i, j] = sr_pot(r, i_sr_params, lam) + cou( + r, qi, qj, lam, charge_coeff + ) + else: + mixed = mix(i_sr_params, j_sr_params) + u[:, i, j] = sr_pot(r, mixed, lam) + cou(r, qi, qj, lam, charge_coeff) + return u diff --git a/reference/pyrism/tests/__init__.py b/reference/pyrism/tests/__init__.py new file mode 100644 index 00000000..325e75d3 --- /dev/null +++ b/reference/pyrism/tests/__init__.py @@ -0,0 +1,3 @@ +""" +Empty init file in case you choose a package besides PyTest such as Nose which may look for such a file +""" diff --git a/reference/pyrism/tests/inputs/24dimepen.toml b/reference/pyrism/tests/inputs/24dimepen.toml new file mode 100644 index 00000000..5d9aedcc --- /dev/null +++ b/reference/pyrism/tests/inputs/24dimepen.toml @@ -0,0 +1,62 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-6 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 23 +nspu = 1 + +[solvent.water] +dens = 0.033422858685 +ns = 3 +O = [ [ 78.15, 3.16572, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 7.815, 1.16572, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 7.815, 1.16572, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.24dimepen] +dens = 0.0 +ns = 23 +C = [ [ 55.05221691240736, 1.6998347542253702, -0.07139999999999999,], [ 0.086, 0.657, -0.717,],] +C1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0662,], [ -1.383, 0.283, -0.434,],] +C2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0662,], [ 1.122, 0.138, 0.3,],] +C3 = [ [ 55.05221691240736, 1.6998347542253702, -0.08984999972561093,], [ -1.596, -1.228, -0.341,],] +C4 = [ [ 55.05221691240736, 1.6998347542253702, -0.08984999972561093,], [ -1.842, 0.949, 0.867,],] +C5 = [ [ 55.05221691240736, 1.6998347542253702, -0.08984999972561093,], [ 1.087, -1.383, 0.447,],] +C6 = [ [ 55.05221691240736, 1.6998347542253702, -0.08984999972561093,], [ 2.526, 0.584, -0.122,],] +H = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 0.165, 1.75, -0.783,],] +H1 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 0.347, 0.277, -1.715,],] +H2 = [ [ 7.900546687705287, 1.324766393630111, 0.0452,], [ -1.991, 0.674, -1.26,],] +H3 = [ [ 7.900546687705287, 1.324766393630111, 0.0452,], [ 0.927, 0.586, 1.282,],] +H4 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -2.652, -1.425, -0.571,],] +H5 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -1.038, -1.785, -1.097,],] +H6 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -1.474, -1.642, 0.66,],] +H7 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -2.914, 0.782, 1.02,],] +H8 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -1.32, 0.552, 1.744,],] +H9 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ -1.678, 2.031, 0.832,],] +H10 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 0.366, -1.716, 1.192,],] +H11 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 0.974, -1.904, -0.506,],] +H12 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 2.047, -1.73, 0.854,],] +H13 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 3.272, 0.283, 0.621,],] +H14 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 2.809, 0.144, -1.085,],] +H15 = [ [ 7.900546687705287, 1.324766393630111, 0.03295,], [ 2.575, 1.673, -0.218,],] diff --git a/reference/pyrism/tests/inputs/2_propanol.toml b/reference/pyrism/tests/inputs/2_propanol.toml new file mode 100644 index 00000000..98c296c1 --- /dev/null +++ b/reference/pyrism/tests/inputs/2_propanol.toml @@ -0,0 +1,111 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "DRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1E-7 +diel = 78.4 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +#Pettitt and Rossky TIP3P water model +[solvent.water] +dens = 0.03334 +ns = 3 + "O_w" = [ + [78.177, 3.15, -0.834], + [0.0, 0.0, 0.0] + ] + + "H1_w" = [ + [23.14810, 0.4, 0.417], + [9.57200000e-01, 0.0, 0.0] + ] + + "H2_w" = [ + [23.14810, 0.4, 0.417], + [-2.39988000e-01, 9.26627000e-01, 0.00000000e+00] + ] + +[solute] +nsu = 12 +nspu = 1 + +[solute.2propanol] +dens = 0.0 +ns = 12 + +"C1" = [ + [25.1609, 3.8, -0.115], + [-0.89, -0.343, -1.107] +] + +"C2" = [ + [25.1609, 3.8, 0.227], + [-0.073, -0.315, 0.183] +] + +"C3" = [ + [25.1609, 3.8, -0.115], + [1.42, -0.25, -0.121] +] + +"O" = [ + [85.5473, 3.07, -0.7], + [-0.376, 0.82, 0.977] +] + +"OH" = [ + [23.14809, 0.4, 0.435], + [-1.316, 0.824, 1.097] +] + +"H1" = [ + [25.1609, 2.5, 0.038], + [-0.293, -1.232, 0.784] +] + +"H2" = [ + [25.1609, 2.5, 0.038], + [2.019, -0.218, 0.799] +] + +"H3" = [ + [25.1609, 2.5, 0.038], + [1.678, 0.639, -0.711] +] + +"H4" = [ + [25.1609, 2.5, 0.038], + [1.735, -1.133, -0.693] +] + +"H5" = [ + [25.1609, 2.5, 0.038], + [-0.728, 0.558, -1.713] +] + +"H6" = [ + [25.1609, 2.5, 0.038], + [-0.613, -1.209, -1.722] +] + +"H7" = [ + [25.1609, 2.5, 0.038], + [-1.967, -0.415, -0.906] +] diff --git a/reference/pyrism/tests/inputs/HR1982_Br2_IV.toml b/reference/pyrism/tests/inputs/HR1982_Br2_IV.toml new file mode 100644 index 00000000..c358e599 --- /dev/null +++ b/reference/pyrism/tests/inputs/HR1982_Br2_IV.toml @@ -0,0 +1,41 @@ +[system] +temp = 296.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "PY" +IE = "XRISM" +solver = "MDIIS" +depth = 7 +picard_damping = 0.001 +itermax = 10000 +tol = 1E-7 + +[solvent] +nsv = 3 +nspv = 1 + +[solvent.Br2X] +dens = 0.01175728342 +ns = 3 + +"Br1" = [ + [130.0, 3.63, 0.0], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"Br2" = [ + [130.0, 3.63, 0.0], + [2.28400000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"X" = [ + [0.0724, 1.0, 0.0], + [1.14200000e+00, 0.00000000e+00, 0.00000000e+00] +] diff --git a/reference/pyrism/tests/inputs/argon_uv.toml b/reference/pyrism/tests/inputs/argon_uv.toml new file mode 100644 index 00000000..aff578ed --- /dev/null +++ b/reference/pyrism/tests/inputs/argon_uv.toml @@ -0,0 +1,48 @@ +[system] +temp = 200 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 512 +radius = 10.24 +lam = 1 + +[params] +potential = "LJ" +closure = "HNC" +IE = "XRISM" +solver = "MDIIS" +depth = 5 +picard_damping = 0.001 +itermax = 10000 +tol = 1E-12 + +[solvent] +nsv = 1 +nspv = 1 + +[solvent.argon] +dens = 0.02 +ns = 1 +"Ar" = [ + [115.8875283, 3.4, 0.0], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + + +[solute] +nsu = 2 +nspu = 1 + +[solute.diargon] +dens = 0.0 +ns = 2 +"Ar1" = [ + [115.8875283, 3.4, 0.0], + [0.0, 0.0, 0.0] +] + +"Ar2" = [ + [115.8875283, 3.4, 0.0], + [2.0, 0.0, 0.0] +] diff --git a/reference/pyrism/tests/inputs/cSPCE.toml b/reference/pyrism/tests/inputs/cSPCE.toml new file mode 100644 index 00000000..9028e3e0 --- /dev/null +++ b/reference/pyrism/tests/inputs/cSPCE.toml @@ -0,0 +1,42 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 12 +picard_damping = 0.5 +itermax = 10000 +tol = 1E-5 +diel = 78.497 +adbcor = 1.5 + + +[solvent] +nsv = 3 +nspv = 1 +[solvent.water] +dens = 3.3422858685000001E-002 +ns = 3 +"O" = [ + [78.15, 3.16572, -0.8476], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H1" = [ + [7.815, 1.16572, 0.4238], + [1.00000000e+00, 0.00000000e+00, 0.00000000e+00] +] + +"H2" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] diff --git a/reference/pyrism/tests/inputs/cSPCE_NaCl.toml b/reference/pyrism/tests/inputs/cSPCE_NaCl.toml new file mode 100644 index 00000000..848be2b5 --- /dev/null +++ b/reference/pyrism/tests/inputs/cSPCE_NaCl.toml @@ -0,0 +1,57 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +depth = 20 +picard_damping = 0.3 +itermax = 10000 +tol = 1E-12 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 5 +nspv = 3 +[solvent.water] +dens = 3.3274431982198593E-02 +ns = 3 +"O" = [ + [78.15, 3.16571950504, -0.8476], + [0.0, 0.0, 0.0] +] + +"H1" = [ + [7.815, 1.16572, 0.4238], + [1.0, 0.0, 0.0] +] + +"H2" = [ + [7.815, 1.16572, 0.4238], + [-3.33314000e-01, 9.42816000e-01, 0.00000000e+00] +] + +[solvent.na] +dens = 3.0110683E-06 +ns = 1 +"Na" = [ + [1.393909966, 3.32839761097, 1.0], + [0.0, 0.0, 0.0] +] + +[solvent.cl] +dens = 3.0110683E-06 +ns = 1 +"Cl" = [ + [50.32165925, 4.40103966761, -1.0], + [0.0, 0.0, 0.0] +] diff --git a/reference/pyrism/tests/inputs/chloro.toml b/reference/pyrism/tests/inputs/chloro.toml new file mode 100644 index 00000000..0777989f --- /dev/null +++ b/reference/pyrism/tests/inputs/chloro.toml @@ -0,0 +1,46 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 2 +adbcor = 1.5 + +[solvent] +nsv = 5 +nspv = 1 + +[solute] +nsu = 5 +nspu = 1 + +[solvent.chloroform] +dens = 0.00751615 +ns = 5 +H = [ [ 7.9, 2.11286, 0.0,], [ -1.302348, 0.821262, 0.0,],] +C = [ [ 55.05, 3.39624, 0.0,], [ -0.384052, 0.242154, 0.0,],] +Cl1 = [ [ 133.35, 3.46744, 0.0,], [ 0.980261, 1.397754, 0.0,],] +Cl2 = [ [ 133.35, 3.46744, 0.0,], [ -0.384052, -0.765765, 1.476687,],] +Cl3 = [ [ 133.35, 3.46744, 0.0,], [ 0.384052, -0.765765, -1.476687,],] + +[solute.chloroform_u] +dens = 0.0 +ns = 5 +H = [ [ 7.9, 2.11286, 0.0,], [ 2.697652, 4.821262, 4.0,],] +C = [ [ 55.05, 3.39624, 0.0,], [ 3.615948, 4.242154, 4.0,],] +Cl1 = [ [ 133.35, 3.46744, 0.0,], [ 4.980261, 5.397754, 4.0,],] +Cl2 = [ [ 133.35, 3.46744, 0.0,], [ 3.615948, 3.234235, 5.476687,],] +Cl3 = [ [ 133.35, 3.46744, 0.0,], [ 4.384052, 3.234235, 2.523313,],] diff --git a/reference/pyrism/tests/inputs/chloro_cg.toml b/reference/pyrism/tests/inputs/chloro_cg.toml new file mode 100644 index 00000000..3d00d165 --- /dev/null +++ b/reference/pyrism/tests/inputs/chloro_cg.toml @@ -0,0 +1,46 @@ +[system] +temp = 298.15 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 10 + + + +[params] +potential = "LJ" +closure = "KH" +IE = "XRISM" +solver = "MDIIS" +depth = 8 +picard_damping = 0.5 +itermax = 10000 +tol = 1e-7 +diel = 4.81 +adbcor = 1.5 + + + +[solvent] +nsv = 5 +nspv = 1 + +[solute] +nsu = 1 +nspu = 1 + +[solvent.chloroform] +dens = 0.00751615 +ns = 5 +H = [ [ 7.9, 2.11286, 0.325656,], [ -1.302348, 0.821262, 0.0,],] +C = [ [ 55.05, 3.39624, -0.425848,], [ -0.384052, 0.242154, 0.0,],] +Cl1 = [ [ 133.35, 3.46744, 0.033397333,], [ 0.980261, 1.397754, 0.0,],] +Cl2 = [ [ 133.35, 3.46744, 0.033397333,], [ -0.384052, -0.765765, 1.476687,],] +Cl3 = [ [ 133.35, 3.46744, 0.033397333,], [ 0.384052, -0.765765, -1.476687,],] + +[solute.chloroform] +dens = 0.0 +ns = 1 +Chlo = [ [ 463.0, 16.0, 0.0,], [ 0.0, 0.0, 0.0,],] diff --git a/reference/pyrism/tests/inputs/nhexylbenzene.toml b/reference/pyrism/tests/inputs/nhexylbenzene.toml new file mode 100644 index 00000000..79efeaf1 --- /dev/null +++ b/reference/pyrism/tests/inputs/nhexylbenzene.toml @@ -0,0 +1,69 @@ +[system] +temp = 298 +kT = 1.0 +kU = 0.00198720414667 +charge_coeff = 167101.0 +npts = 16384 +radius = 20.48 +lam = 1 + +[params] +potential = "LJ" +closure = "KH" +IE = "DRISM" +solver = "MDIIS" +picard_damping = 0.5 +depth = 8 +itermax = 10000 +tol = 1e-7 +diel = 78.497 +adbcor = 1.5 + +[solvent] +nsv = 3 +nspv = 1 + +[solute] +nsu = 30 +nspu = 1 + +[solvent.water] +dens = 0.033422858685 +ns = 3 +O = [ [ 78.15, 3.16572, -0.8476,], [ 0.0, 0.0, 0.0,],] +H1 = [ [ 7.815, 1.16572, 0.4238,], [ 1.0, 0.0, 0.0,],] +H2 = [ [ 7.815, 1.16572, 0.4238,], [ -0.333314, 0.942816, 0.0,],] + +[solute.nhexylbenzene] +dens = 0.0 +ns = 30 +C = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 2.288, -0.064, -0.64,],] +C1 = [ [ 55.05221691240736, 1.6998347542253702, -0.0764,], [ 0.897, -0.004, -0.005,],] +C2 = [ [ 55.05221691240736, 1.6998347542253702, -0.0794,], [ 3.387, 0.003, 0.422,],] +C3 = [ [ 55.05221691240736, 1.6998347542253702, -0.037099999999999994,], [ -0.201, -0.036, -1.071,],] +C4 = [ [ 55.05221691240736, 1.6998347542253702, -0.08039999999999999,], [ 4.777, -0.024, -0.214,],] +C5 = [ [ 43.276879937664646, 1.6998347539724155, -0.0773,], [ -1.576, -0.013, -0.454,],] +C6 = [ [ 55.05221691240736, 1.6998347542253702, -0.0931,], [ 5.871, 0.076, 0.837,],] +C7 = [ [ 43.276879937664646, 1.6998347539724155, -0.128,], [ -2.2, -1.21, -0.135,],] +C8 = [ [ 43.276879937664646, 1.6998347539724155, -0.128,], [ -2.196, 1.205, -0.214,],] +C9 = [ [ 43.276879937664646, 1.6998347539724155, -0.128,], [ -3.473, -1.189, 0.435,],] +C10 = [ [ 43.276879937664646, 1.6998347539724155, -0.128,], [ -3.468, 1.226, 0.357,],] +C11 = [ [ 43.276879937664646, 1.6998347539724155, -0.13299999999999998,], [ -4.107, 0.029, 0.682,],] +H = [ [ 7.900546687705287, 1.324766393630111, 0.0392,], [ 2.39, -0.99, -1.218,],] +H1 = [ [ 7.900546687705287, 1.324766393630111, 0.0392,], [ 2.406, 0.771, -1.342,],] +H2 = [ [ 7.900546687705287, 1.324766393630111, 0.0447,], [ 0.805, 0.911, 0.595,],] +H3 = [ [ 7.900546687705287, 1.324766393630111, 0.0447,], [ 0.774, -0.848, 0.685,],] +H4 = [ [ 7.900546687705287, 1.324766393630111, 0.04019999999999999,], [ 3.282, -0.842, 1.114,],] +H5 = [ [ 7.900546687705287, 1.324766393630111, 0.04019999999999999,], [ 3.272, 0.92, 1.012,],] +H6 = [ [ 7.900546687705287, 1.324766393630111, 0.0477,], [ -0.089, 0.817, -1.753,],] +H7 = [ [ 7.900546687705287, 1.324766393630111, 0.0477,], [ -0.095, -0.932, -1.695,],] +H8 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 4.907, -0.95, -0.785,],] +H9 = [ [ 7.900546687705287, 1.324766393630111, 0.0387,], [ 4.88, 0.809, -0.919,],] +H10 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 6.856, 0.054, 0.36,],] +H11 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 5.788, 1.01, 1.402,],] +H12 = [ [ 7.900546687705287, 1.324766393630111, 0.0327,], [ 5.816, -0.759, 1.541,],] +H13 = [ [ 7.548293033434298, 1.2998212293675426, 0.1305,], [ -1.714, -2.163, -0.321,],] +H14 = [ [ 7.548293033434298, 1.2998212293675426, 0.1305,], [ -1.706, 2.142, -0.462,],] +H15 = [ [ 7.548293033434298, 1.2998212293675426, 0.12999999999999998,], [ -3.97, -2.121, 0.689,],] +H16 = [ [ 7.548293033434298, 1.2998212293675426, 0.12999999999999998,], [ -3.962, 2.174, 0.549,],] +H17 = [ [ 7.548293033434298, 1.2998212293675426, 0.12999999999999998,], [ -5.097, 0.045, 1.127,],] diff --git a/reference/pyrism/tests/sfed_fft.py b/reference/pyrism/tests/sfed_fft.py new file mode 100644 index 00000000..d5cd296a --- /dev/null +++ b/reference/pyrism/tests/sfed_fft.py @@ -0,0 +1,26 @@ +from pyrism.rism_ctrl import * +import matplotlib.pyplot as plt +from scipy.fft import rfft, rfftfreq, irfft + +mol = RismController("../data/cSPCE_XRISM_methane.toml") + +mol.initialise_controller() + +mol.do_rism(verbose=True) + +fft_sfed = rfft(mol.SFED["KH"]) +freqs = rfftfreq(mol.SFED["KH"].shape[0], mol.vv.grid.d_r) + +a = 0 +b = np.argmax(fft_sfed) + 50 +new_signal = np.zeros_like(fft_sfed) +new_signal[a:b] = fft_sfed[a:b] +plt.plot(freqs, np.abs(fft_sfed)) +plt.plot(freqs, np.abs(new_signal)) +plt.show() + + +new_sfed = irfft(new_signal) +plt.plot(mol.vv.grid.ri, mol.SFED["KH"]) +plt.plot(mol.vv.grid.ri, new_sfed) +plt.show() diff --git a/reference/pyrism/tests/test_calculations.py b/reference/pyrism/tests/test_calculations.py new file mode 100644 index 00000000..d0ab25e6 --- /dev/null +++ b/reference/pyrism/tests/test_calculations.py @@ -0,0 +1,122 @@ +from pyrism.rism_ctrl import * +import unittest +from numpy.testing import assert_allclose +import warnings +from pathlib import Path + + +class TestRISMJobs(unittest.TestCase): + def setUp(self): + self.verbosity = False + self.rtol = 1e-2 + self.atol = 1e-2 + warnings.simplefilter("ignore") + + def test_2_propanol(self): + mol = RismController(Path("./inputs/2_propanol.toml").resolve()) + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "./outputs/2_propanol/2_propanol.guv", delimiter=",", skip_header=2 + )[:, 1:].reshape((mol.uv.grid.npts, mol.uv.ns1, mol.uv.ns2)) + + assert_allclose(test_case, mol.uv.g, self.rtol, self.atol) + + def test_argon_uv(self): + mol = RismController("inputs/argon_uv.toml") + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "outputs/argon_uv/argon_uv.tuv", delimiter=",", skip_header=2 + )[:, 1:].reshape((mol.uv.grid.npts, mol.uv.ns1, mol.uv.ns2)) + + assert_allclose(test_case, mol.uv.t, self.rtol, self.atol) + + def test_24dimepen(self): + mol = RismController("inputs/24dimepen.toml") + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "outputs/24dimepen/24dimepen.cuv", delimiter=",", skip_header=2 + )[:, 1:].reshape((mol.uv.grid.npts, mol.uv.ns1, mol.uv.ns2)) + + assert_allclose(test_case, mol.uv.c, self.rtol, self.atol) + + def test_chloro(self): + mol = RismController("inputs/chloro.toml") + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "outputs/chloro/chloro_SFED.duv", delimiter=",", skip_header=2, usecols=1 + ) + + assert_allclose(test_case, mol.SFED["HNC"], self.rtol, self.atol) + + def test_chloro_cg(self): + mol = RismController("inputs/chloro_cg.toml") + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "outputs/chloro_cg/chloro_cg_SFED.duv", + delimiter=",", + skip_header=2, + usecols=2, + ) + + assert_allclose(test_case, mol.SFED["KH"], self.rtol, self.atol) + + def test_nhexylbenzene(self): + mol = RismController("inputs/nhexylbenzene.toml") + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "outputs/nhexylbenzene/nhexylbenzene_SFED.duv", + delimiter=",", + skip_header=2, + usecols=3, + ) + + assert_allclose(test_case, mol.SFED["GF"], self.rtol, self.atol) + + def test_cSPCE(self): + mol = RismController("inputs/cSPCE.toml") + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "outputs/cSPCE/cSPCE.gvv", delimiter=",", skip_header=2 + )[:, 1:].reshape((mol.vv.grid.npts, mol.vv.ns1, mol.vv.ns2)) + + assert_allclose(test_case, mol.vv.g, self.rtol, self.atol) + + def test_cSPCE_NaCl(self): + mol = RismController("inputs/cSPCE_NaCl.toml") + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "outputs/cSPCE_NaCl/cSPCE_NaCl.tvv", delimiter=",", skip_header=2 + )[:, 1:].reshape((mol.vv.grid.npts, mol.vv.ns1, mol.vv.ns2)) + + assert_allclose(test_case, mol.vv.t, self.rtol, self.atol) + + def test_HR1982_Br2_IV(self): + mol = RismController("inputs/HR1982_Br2_IV.toml") + mol.initialise_controller() + mol.do_rism(verbose=self.verbosity) + + test_case = np.genfromtxt( + "outputs/HR1982_Br2_IV/HR1982_Br2_IV.cvv", delimiter=",", skip_header=2 + )[:, 1:].reshape((mol.vv.grid.npts, mol.vv.ns1, mol.vv.ns2)) + + assert_allclose(test_case, mol.vv.c, self.rtol, self.atol) + + +if __name__ == "__main__": + unittest.main() diff --git a/reference/pyrism/tests/test_thermo.py b/reference/pyrism/tests/test_thermo.py new file mode 100644 index 00000000..b8931b2e --- /dev/null +++ b/reference/pyrism/tests/test_thermo.py @@ -0,0 +1,36 @@ +from pyrism.rism_ctrl import * +from pyrism import rust_helpers +import matplotlib.pyplot as plt + +mol = RismController("../data/cSPCE_DRISM_methane.toml") + +mol.initialise_controller() + +mol.do_rism(verbose=True) + +print("isothermal compressibility (1/A^3):", (mol.isothermal_compressibility(mol.vv))) + +pressure, pressure_plus = mol.pressure() + +print("pressure (kcal/mol/A^3):", pressure) + +print("pressure - ideal pressure (kcal/mol/A^3):", pressure_plus) + +KB_PMV = mol.kb_partial_molar_volume() +RISM_KB_PMV = mol.rism_kb_partial_molar_volume() + +print("KB PMV (A^3):", KB_PMV) + +print("KB PMV (cm^3 / mol):", KB_PMV / 1e24 * 6.022e23) + +print("RISM-KB PMV (A^3):", RISM_KB_PMV) + +print("RISM-KB PMV (cm^3 / mol):", RISM_KB_PMV / 1e24 * 6.022e23) + +print("Dimensionless PMV:", mol.dimensionless_pmv()) + +print("HNC (kcal/mol):", mol.SFE["HNC"]) + +print("PW (kcal/mol):", mol.SFE["PW"]) + +print("PC+ (kcal/mol):", mol.pc_plus())