Skip to content

Commit 72c3d26

Browse files
committed
rebase and update all models
1 parent 7c2c3ec commit 72c3d26

37 files changed

+206
-145
lines changed

.github/workflows/test.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ name: Test
22

33
on:
44
push:
5-
branches: [main]
5+
branches: [main, development]
66
pull_request:
7-
branches: [main]
7+
branches: [main, development]
88

99
env:
1010
CARGO_TERM_COLOR: always

.github/workflows/wheels.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
name: Build Wheels
22
on:
33
push:
4-
branches: [main]
4+
branches: [main, development]
55
pull_request:
6-
branches: [main]
6+
branches: [main, development]
77
jobs:
88
linux:
99
runs-on: ubuntu-latest

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ inherits = "release"
5353
lto = true
5454

5555
[features]
56-
default = []
56+
default = ["all_models"]
5757
dft = ["feos-dft", "petgraph"]
5858
estimator = []
5959
association = []

benches/dual_numbers.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ fn state_pcsaft(parameters: PcSaftParameters) -> State<PcSaft> {
2828
}
2929

3030
/// Residual Helmholtz energy given an equation of state and a StateHD.
31-
fn a_res<D: DualNum<f64>, E: EquationOfState>(inp: (&Arc<E>, &StateHD<D>)) -> D
31+
fn a_res<D: DualNum<f64> + Copy, E: EquationOfState>(inp: (&Arc<E>, &StateHD<D>)) -> D
3232
where
3333
(dyn HelmholtzEnergy + 'static): HelmholtzEnergyDual<D>,
3434
{

feos-dft/src/functional.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ impl<T: HelmholtzEnergyFunctional> DFT<T> {
452452
D: Dimension,
453453
D::Larger: Dimension<Smaller = D>,
454454
{
455-
let temperature_dual = Dual64::from(temperature).derive();
455+
let temperature_dual = Dual64::from(temperature).derivative();
456456
let density_dual = density.mapv(Dual64::from);
457457
let weighted_densities = convolver.weighted_densities(&density_dual);
458458
let contributions = self.contributions();

feos-dft/src/functional_contribution.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use feos_core::{EosResult, HelmholtzEnergyDual, StateHD};
33
use ndarray::prelude::*;
44
use ndarray::RemoveAxis;
55
use num_dual::*;
6-
use num_traits::{One, Zero};
6+
use num_traits::Zero;
77
use std::fmt::Display;
88

99
macro_rules! impl_helmholtz_energy {
@@ -130,13 +130,13 @@ pub trait FunctionalContribution:
130130

131131
for i in 0..wd.shape()[0] {
132132
wd.index_axis_mut(Axis(0), i)
133-
.map_inplace(|x| x.eps[0] = Dual64::one());
133+
.map_inplace(|x| x.eps = Derivative::derivative());
134134
phi = self.calculate_helmholtz_energy_density(t, wd.view())?;
135135
first_partial_derivative
136136
.index_axis_mut(Axis(0), i)
137-
.assign(&phi.mapv(|p| p.eps[0]));
137+
.assign(&phi.mapv(|p| p.eps.unwrap()));
138138
wd.index_axis_mut(Axis(0), i)
139-
.map_inplace(|x| x.eps[0] = Dual64::zero());
139+
.map_inplace(|x| x.eps = Derivative::none());
140140
}
141141
helmholtz_energy_density.assign(&phi.mapv(|p| p.re));
142142
Ok(())

feos-dft/src/profile.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ where
617617
let functional_contributions = self.dft.contributions();
618618
let weight_functions: Vec<WeightFunctionInfo<Dual64>> = functional_contributions
619619
.iter()
620-
.map(|c| c.weight_functions(Dual64::from(t).derive()))
620+
.map(|c| c.weight_functions(Dual64::from(t).derivative()))
621621
.collect();
622622
let convolver: Arc<dyn Convolver<_, D>> =
623623
ConvolverFFT::plan(&self.grid, &weight_functions, None);
@@ -638,11 +638,11 @@ where
638638
let x = (self.bulk.partial_molar_volume(Contributions::Total)
639639
* self.bulk.dp_dt(Contributions::Total))
640640
.to_reduced(SIUnit::reference_molar_entropy())?;
641-
let mut lhs = dfdrhodt.mapv(|d| d.eps[0]);
641+
let mut lhs = dfdrhodt.mapv(|d| d.eps.unwrap());
642642
lhs.outer_iter_mut()
643643
.zip(dfdrhodt_bulk.into_iter())
644644
.zip(x.into_iter())
645-
.for_each(|((mut lhs, d), x)| lhs -= d.eps[0] - x);
645+
.for_each(|((mut lhs, d), x)| lhs -= d.eps.unwrap() - x);
646646
lhs.outer_iter_mut()
647647
.zip(rho.outer_iter())
648648
.zip(rho_bulk.into_iter())

src/association/dft.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ where
111111

112112
impl<P: HardSphereProperties> Association<P> {
113113
pub fn calculate_helmholtz_energy_density<
114-
N: DualNum<f64> + ScalarOperand,
114+
N: DualNum<f64> + Copy + ScalarOperand,
115115
S: Data<Elem = N>,
116116
>(
117117
&self,
@@ -183,7 +183,10 @@ impl<P: HardSphereProperties> Association<P> {
183183
}
184184
}
185185

186-
fn helmholtz_energy_density_ab_analytic<N: DualNum<f64> + ScalarOperand, S: Data<Elem = N>>(
186+
fn helmholtz_energy_density_ab_analytic<
187+
N: DualNum<f64> + Copy + ScalarOperand,
188+
S: Data<Elem = N>,
189+
>(
187190
&self,
188191
temperature: N,
189192
rho0: &Array2<N>,
@@ -217,7 +220,10 @@ impl<P: HardSphereProperties> Association<P> {
217220
rhoa * xa.mapv(f) + rhob * xb.mapv(f)
218221
}
219222

220-
fn helmholtz_energy_density_cc_analytic<N: DualNum<f64> + ScalarOperand, S: Data<Elem = N>>(
223+
fn helmholtz_energy_density_cc_analytic<
224+
N: DualNum<f64> + Copy + ScalarOperand,
225+
S: Data<Elem = N>,
226+
>(
221227
&self,
222228
temperature: N,
223229
rho0: &Array2<N>,

src/association/mod.rs

+14-7
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,11 @@ impl<P: HardSphereProperties> Association<P> {
326326
(rhoa * (xa.ln() - xa * 0.5 + 0.5) + rhob * (xb.ln() - xb * 0.5 + 0.5)) * state.volume
327327
}
328328

329-
fn helmholtz_energy_cc_analytic<D: DualNum<f64>>(&self, state: &StateHD<D>, delta: D) -> D {
329+
fn helmholtz_energy_cc_analytic<D: DualNum<f64> + Copy>(
330+
&self,
331+
state: &StateHD<D>,
332+
delta: D,
333+
) -> D {
330334
let a = &self.association_parameters;
331335

332336
// site density
@@ -548,8 +552,9 @@ mod tests_gc_pcsaft {
548552
Dual64::from_re(volume).derivative(),
549553
arr1(&[Dual64::from_re(moles)]),
550554
);
551-
let pressure =
552-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
555+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
556+
* temperature
557+
* EosUnit::reference_pressure();
553558
assert_relative_eq!(pressure, -3.6819598891967344 * PASCAL, max_relative = 1e-10);
554559
}
555560

@@ -568,8 +573,9 @@ mod tests_gc_pcsaft {
568573
Dual64::from_re(volume).derivative(),
569574
arr1(&[Dual64::from_re(moles)]),
570575
);
571-
let pressure =
572-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
576+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
577+
* temperature
578+
* EosUnit::reference_pressure();
573579
assert_relative_eq!(pressure, -3.6819598891967344 * PASCAL, max_relative = 1e-10);
574580
}
575581

@@ -590,8 +596,9 @@ mod tests_gc_pcsaft {
590596
Dual64::from_re(volume).derivative(),
591597
moles.mapv(Dual64::from_re),
592598
);
593-
let pressure =
594-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
599+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
600+
* temperature
601+
* EosUnit::reference_pressure();
595602
assert_relative_eq!(pressure, -26.105606376765632 * PASCAL, max_relative = 1e-10);
596603
}
597604
}

src/gc_pcsaft/dft/dispersion.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ impl AttractiveFunctional {
2424
}
2525
}
2626

27-
impl<N: DualNum<f64> + ScalarOperand> FunctionalContributionDual<N> for AttractiveFunctional {
27+
impl<N: DualNum<f64> + Copy + ScalarOperand> FunctionalContributionDual<N>
28+
for AttractiveFunctional
29+
{
2830
fn weight_functions(&self, temperature: N) -> WeightFunctionInfo<N> {
2931
let p = &self.parameters;
3032

src/gc_pcsaft/dft/hard_chain.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl ChainFunctional {
2323
}
2424
}
2525

26-
impl<N: DualNum<f64> + ScalarOperand> FunctionalContributionDual<N> for ChainFunctional {
26+
impl<N: DualNum<f64> + Copy + ScalarOperand> FunctionalContributionDual<N> for ChainFunctional {
2727
fn weight_functions(&self, temperature: N) -> WeightFunctionInfo<N> {
2828
let p = &self.parameters;
2929
let d = p.hs_diameter(temperature);

src/gc_pcsaft/dft/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl HardSphereProperties for GcPcSaftFunctionalParameters {
128128
MonomerShape::Heterosegmented([m.clone(), m.clone(), m.clone(), m], &self.component_index)
129129
}
130130

131-
fn hs_diameter<D: DualNum<f64>>(&self, temperature: D) -> Array1<D> {
131+
fn hs_diameter<D: DualNum<f64> + Copy>(&self, temperature: D) -> Array1<D> {
132132
let ti = temperature.recip() * -3.0;
133133
Array1::from_shape_fn(self.sigma.len(), |i| {
134134
-((ti * self.epsilon_k[i]).exp() * 0.12 - 1.0) * self.sigma[i]

src/gc_pcsaft/eos/dispersion.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ pub struct Dispersion {
6666
pub parameters: Arc<GcPcSaftEosParameters>,
6767
}
6868

69-
impl<D: DualNum<f64>> HelmholtzEnergyDual<D> for Dispersion {
69+
impl<D: DualNum<f64> + Copy> HelmholtzEnergyDual<D> for Dispersion {
7070
fn helmholtz_energy(&self, state: &StateHD<D>) -> D {
7171
// auxiliary variables
7272
let p = &self.parameters;
@@ -154,8 +154,9 @@ mod test {
154154
Dual64::from_re(volume).derivative(),
155155
arr1(&[Dual64::from_re(moles)]),
156156
);
157-
let pressure =
158-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
157+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
158+
* temperature
159+
* EosUnit::reference_pressure();
159160
assert_relative_eq!(pressure, -2.846724434944439 * PASCAL, max_relative = 1e-10);
160161
}
161162

@@ -176,8 +177,9 @@ mod test {
176177
Dual64::from_re(volume).derivative(),
177178
arr1(&[Dual64::from_re(moles)]),
178179
);
179-
let pressure =
180-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
180+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
181+
* temperature
182+
* EosUnit::reference_pressure();
181183
assert_relative_eq!(pressure, -5.432173507270732 * PASCAL, max_relative = 1e-10);
182184
}
183185
}

src/gc_pcsaft/eos/hard_chain.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub struct HardChain {
1010
pub parameters: Arc<GcPcSaftEosParameters>,
1111
}
1212

13-
impl<D: DualNum<f64>> HelmholtzEnergyDual<D> for HardChain {
13+
impl<D: DualNum<f64> + Copy> HelmholtzEnergyDual<D> for HardChain {
1414
fn helmholtz_energy(&self, state: &StateHD<D>) -> D {
1515
// temperature dependent segment diameter
1616
let diameter = self.parameters.hs_diameter(state.temperature);
@@ -69,8 +69,9 @@ mod test {
6969
Dual64::new_scalar(volume, 1.0),
7070
arr1(&[Dual64::from_re(moles)]),
7171
);
72-
let pressure =
73-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
72+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
73+
* temperature
74+
* EosUnit::reference_pressure();
7475
assert_relative_eq!(
7576
pressure,
7677
-7.991735636207462e-1 * PASCAL,
@@ -95,8 +96,9 @@ mod test {
9596
Dual64::from_re(volume).derivative(),
9697
arr1(&[Dual64::from_re(moles)]),
9798
);
98-
let pressure =
99-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
99+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
100+
* temperature
101+
* EosUnit::reference_pressure();
100102
assert_relative_eq!(pressure, -1.2831486124723626 * PASCAL, max_relative = 1e-10);
101103
}
102104
}

src/gc_pcsaft/eos/mod.rs

+15-10
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,9 @@ mod test {
142142
Dual64::from_re(volume).derivative(),
143143
arr1(&[Dual64::from_re(moles)]),
144144
);
145-
let pressure =
146-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
145+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
146+
* temperature
147+
* EosUnit::reference_pressure();
147148
assert_relative_eq!(pressure, 1.5285037907989527 * PASCAL, max_relative = 1e-10);
148149
}
149150

@@ -162,8 +163,9 @@ mod test {
162163
Dual64::from_re(volume).derivative(),
163164
arr1(&[Dual64::from_re(moles)]),
164165
);
165-
let pressure =
166-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
166+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
167+
* temperature
168+
* EosUnit::reference_pressure();
167169
assert_relative_eq!(pressure, 2.3168212018200243 * PASCAL, max_relative = 1e-10);
168170
}
169171

@@ -182,8 +184,9 @@ mod test {
182184
Dual64::from_re(volume).derivative(),
183185
arr1(&[Dual64::from_re(moles)]),
184186
);
185-
let pressure =
186-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
187+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
188+
* temperature
189+
* EosUnit::reference_pressure();
187190
assert_relative_eq!(pressure, -3.6819598891967344 * PASCAL, max_relative = 1e-10);
188191
}
189192

@@ -203,8 +206,9 @@ mod test {
203206
Dual64::from_re(volume).derivative(),
204207
arr1(&[Dual64::from_re(moles)]),
205208
);
206-
let pressure =
207-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
209+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
210+
* temperature
211+
* EosUnit::reference_pressure();
208212
assert_relative_eq!(pressure, -3.6819598891967344 * PASCAL, max_relative = 1e-10);
209213
}
210214

@@ -225,8 +229,9 @@ mod test {
225229
Dual64::from_re(volume).derivative(),
226230
moles.mapv(Dual64::from_re),
227231
);
228-
let pressure =
229-
-contrib.helmholtz_energy(&state).eps[0] * temperature * EosUnit::reference_pressure();
232+
let pressure = -contrib.helmholtz_energy(&state).eps.unwrap()
233+
* temperature
234+
* EosUnit::reference_pressure();
230235
assert_relative_eq!(pressure, -26.105606376765632 * PASCAL, max_relative = 1e-10);
231236
}
232237
}

src/gc_pcsaft/eos/parameter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ impl HardSphereProperties for GcPcSaftEosParameters {
277277
MonomerShape::Heterosegmented([m.clone(), m.clone(), m.clone(), m], &self.component_index)
278278
}
279279

280-
fn hs_diameter<D: DualNum<f64>>(&self, temperature: D) -> Array1<D> {
280+
fn hs_diameter<D: DualNum<f64> + Copy>(&self, temperature: D) -> Array1<D> {
281281
let ti = temperature.recip() * -3.0;
282282
Array1::from_shape_fn(self.sigma.len(), |i| {
283283
-((ti * self.epsilon_k[i]).exp() * 0.12 - 1.0) * self.sigma[i]

src/gc_pcsaft/eos/polar.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub const CD: [[f64; 3]; 4] = [
3333

3434
pub const PI_SQ_43: f64 = 4.0 * PI * FRAC_PI_3;
3535

36-
fn pair_integral_ij<D: DualNum<f64>>(mij1: f64, mij2: f64, eta: D, eps_ij_t: D) -> D {
36+
fn pair_integral_ij<D: DualNum<f64> + Copy>(mij1: f64, mij2: f64, eta: D, eps_ij_t: D) -> D {
3737
let eta2 = eta * eta;
3838
let etas = [D::one(), eta, eta2, eta2 * eta, eta2 * eta2];
3939
(0..AD.len())
@@ -45,7 +45,7 @@ fn pair_integral_ij<D: DualNum<f64>>(mij1: f64, mij2: f64, eta: D, eps_ij_t: D)
4545
.sum()
4646
}
4747

48-
fn triplet_integral_ijk<D: DualNum<f64>>(mijk1: f64, mijk2: f64, eta: D) -> D {
48+
fn triplet_integral_ijk<D: DualNum<f64> + Copy>(mijk1: f64, mijk2: f64, eta: D) -> D {
4949
let eta2 = eta * eta;
5050
let etas = [D::one(), eta, eta2, eta2 * eta];
5151
(0..CD.len())
@@ -118,7 +118,7 @@ impl Dipole {
118118
}
119119
}
120120

121-
impl<D: DualNum<f64>> HelmholtzEnergyDual<D> for Dipole {
121+
impl<D: DualNum<f64> + Copy> HelmholtzEnergyDual<D> for Dipole {
122122
fn helmholtz_energy(&self, state: &StateHD<D>) -> D {
123123
let p = &self.parameters;
124124
let ndipole = p.dipole_comp.len();

src/pets/dft/dispersion.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ impl AttractiveFunctional {
2727
}
2828
}
2929

30-
fn att_weight_functions<N: DualNum<f64> + ScalarOperand>(
30+
fn att_weight_functions<N: DualNum<f64> + Copy + ScalarOperand>(
3131
p: &PetsParameters,
3232
psi: f64,
3333
temperature: N,
@@ -39,7 +39,9 @@ fn att_weight_functions<N: DualNum<f64> + ScalarOperand>(
3939
)
4040
}
4141

42-
impl<N: DualNum<f64> + ScalarOperand> FunctionalContributionDual<N> for AttractiveFunctional {
42+
impl<N: DualNum<f64> + Copy + ScalarOperand> FunctionalContributionDual<N>
43+
for AttractiveFunctional
44+
{
4345
fn weight_functions(&self, temperature: N) -> WeightFunctionInfo<N> {
4446
att_weight_functions(&self.parameters, PSI_DFT, temperature)
4547
}

0 commit comments

Comments
 (0)