Skip to content
This repository was archived by the owner on Jul 28, 2022. It is now read-only.

Commit c68bc73

Browse files
RolfStierleprehner
andauthored
Tangential pressure (#22)
* Tangential pressure * fix python getters * remove partially duplicate grand_potential getter Co-authored-by: Philipp Rehner <prehner@ethz.ch>
1 parent dc1579c commit c68bc73

File tree

8 files changed

+42
-30
lines changed

8 files changed

+42
-30
lines changed

src/adsorption/mod.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use super::solver::DFTSolver;
44
use feos_core::{
55
Contributions, EosError, EosResult, EosUnit, EquationOfState, SolverOptions, StateBuilder,
66
};
7-
use ndarray::{arr1, Array1, Dimension, Ix1, Ix3};
7+
use ndarray::{arr1, Array1, Dimension, Ix1, Ix3, RemoveAxis};
88
use quantity::{QuantityArray1, QuantityArray2, QuantityScalar};
99
use std::rc::Rc;
1010

@@ -55,12 +55,17 @@ where
5555
})
5656
}
5757

58-
fn equilibrium<D: Dimension, F: HelmholtzEnergyFunctional + FluidParameters>(
58+
fn equilibrium<
59+
D: Dimension + RemoveAxis + 'static,
60+
F: HelmholtzEnergyFunctional + FluidParameters,
61+
>(
5962
&self,
6063
equilibrium: &Adsorption<U, D, F>,
6164
) -> EosResult<(QuantityArray1<U>, QuantityArray1<U>)>
6265
where
6366
D::Larger: Dimension<Smaller = D>,
67+
D::Smaller: Dimension<Larger = D>,
68+
<D::Larger as Dimension>::Larger: Dimension<Smaller = D::Larger>,
6469
{
6570
let p_eq = equilibrium.pressure().get(0);
6671
match self {
@@ -111,10 +116,16 @@ pub type Adsorption1D<U, F> = Adsorption<U, Ix1, F>;
111116
/// Container structure for adsorption isotherms in 3D pores.
112117
pub type Adsorption3D<U, F> = Adsorption<U, Ix3, F>;
113118

114-
impl<U: EosUnit, D: Dimension, F: HelmholtzEnergyFunctional + FluidParameters> Adsorption<U, D, F>
119+
impl<
120+
U: EosUnit,
121+
D: Dimension + RemoveAxis + 'static,
122+
F: HelmholtzEnergyFunctional + FluidParameters,
123+
> Adsorption<U, D, F>
115124
where
116125
QuantityScalar<U>: std::fmt::Display,
117126
D::Larger: Dimension<Smaller = D>,
127+
D::Smaller: Dimension<Larger = D>,
128+
<D::Larger as Dimension>::Larger: Dimension<Smaller = D::Larger>,
118129
{
119130
fn new<S: PoreSpecification<U, D>>(
120131
functional: &Rc<DFT<F>>,

src/adsorption/pore.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::solver::DFTSolver;
88
use feos_core::{Contributions, EosResult, EosUnit, State, StateBuilder};
99
use ndarray::prelude::*;
1010
use ndarray::Axis as Axis_nd;
11-
use ndarray::Zip;
11+
use ndarray::{RemoveAxis, Zip};
1212
use ndarray_stats::QuantileExt;
1313
use quantity::{QuantityArray, QuantityArray2, QuantityArray4, QuantityScalar};
1414
use std::rc::Rc;
@@ -133,22 +133,19 @@ impl<U: Copy, D: Dimension, F> Clone for PoreProfile<U, D, F> {
133133
}
134134
}
135135

136-
impl<U: EosUnit, D: Dimension, F: HelmholtzEnergyFunctional> PoreProfile<U, D, F>
136+
impl<U: EosUnit, D: Dimension + RemoveAxis + 'static, F: HelmholtzEnergyFunctional>
137+
PoreProfile<U, D, F>
137138
where
138139
D::Larger: Dimension<Smaller = D>,
140+
D::Smaller: Dimension<Larger = D>,
141+
<D::Larger as Dimension>::Larger: Dimension<Smaller = D::Larger>,
139142
{
140143
pub fn solve_inplace(&mut self, solver: Option<&DFTSolver>, debug: bool) -> EosResult<()> {
141144
// Solve the profile
142145
self.profile.solve(solver, debug)?;
143146

144147
// calculate grand potential density
145-
let omega = self
146-
.profile
147-
.integrate(&self.profile.dft.grand_potential_density(
148-
self.profile.temperature,
149-
&self.profile.density,
150-
&self.profile.convolver,
151-
)?);
148+
let omega = self.profile.grand_potential()?;
152149
self.grand_potential = Some(omega);
153150

154151
// calculate interfacial tension

src/functional.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ impl<T: HelmholtzEnergyFunctional> DFT<T> {
213213
let rho = density.to_reduced(U::reference_density())?;
214214
let (mut f, dfdrho) = self.functional_derivative(t, &rho, convolver)?;
215215

216-
// calculate the grand potential density
216+
// Calculate the grand potential density
217217
for ((rho, dfdrho), &m) in rho
218218
.outer_iter()
219219
.zip(dfdrho.outer_iter())

src/interface/mod.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,8 @@ impl<U: EosUnit, F: HelmholtzEnergyFunctional> PlanarInterface<U, F> {
4040

4141
// postprocess
4242
self.surface_tension = Some(self.profile.integrate(
43-
&(self.profile.dft.grand_potential_density(
44-
self.profile.temperature,
45-
&self.profile.density,
46-
&self.profile.convolver,
47-
)? + self.vle.vapor().pressure(Contributions::Total)),
43+
&(self.profile.grand_potential_density()?
44+
+ self.vle.vapor().pressure(Contributions::Total)),
4845
));
4946
let delta_rho = self.vle.liquid().density - self.vle.vapor().density;
5047
self.equimolar_radius = Some(

src/profile.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,15 @@ where
564564
Ok(self.integrate(&self.entropy_density(contributions)?))
565565
}
566566

567+
pub fn grand_potential_density(&self) -> EosResult<QuantityArray<U, D>> {
568+
self.dft
569+
.grand_potential_density(self.temperature, &self.density, &self.convolver)
570+
}
571+
572+
pub fn grand_potential(&self) -> EosResult<QuantityScalar<U>> {
573+
Ok(self.integrate(&self.grand_potential_density()?))
574+
}
575+
567576
pub fn internal_energy(&self, contributions: Contributions) -> EosResult<QuantityScalar<U>> {
568577
// initialize convolver
569578
let t = self.temperature.to_reduced(U::reference_temperature())?;

src/python/profile.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,13 @@ macro_rules! impl_profile {
171171
self.0.profile.internal_energy(contributions)?,
172172
))
173173
}
174+
175+
#[getter]
176+
fn get_grand_potential_density(&self) -> PyResult<$si_arr> {
177+
Ok($si_arr::from(
178+
self.0.profile.grand_potential_density()?,
179+
))
180+
}
174181
}
175182
};
176183
}

src/solvation/mod.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,7 @@ impl<U: EosUnit, F: HelmholtzEnergyFunctional> SolvationProfile<U, F> {
3636
self.profile.solve(solver, debug)?;
3737

3838
// calculate grand potential density
39-
let omega = self
40-
.profile
41-
.integrate(&self.profile.dft.grand_potential_density(
42-
self.profile.temperature,
43-
&self.profile.density,
44-
&self.profile.convolver,
45-
)?);
39+
let omega = self.profile.grand_potential()?;
4640
self.grand_potential = Some(omega);
4741

4842
// calculate solvation free energy

src/solvation/pair_correlation.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,8 @@ impl<U: EosUnit, F: HelmholtzEnergyFunctional + PairPotential> PairCorrelation<U
7676

7777
// calculate self solvation free energy
7878
self.self_solvation_free_energy = Some(self.profile.integrate(
79-
&(self.profile.dft.grand_potential_density(
80-
self.profile.temperature,
81-
&self.profile.density,
82-
&self.profile.convolver,
83-
)? + self.profile.bulk.pressure(Contributions::Total)),
79+
&(self.profile.grand_potential_density()?
80+
+ self.profile.bulk.pressure(Contributions::Total)),
8481
));
8582

8683
// calculate structure factor

0 commit comments

Comments
 (0)