diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 3cd0ef20b..2327e25c3 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -11,12 +11,10 @@ jobs: os: [ubuntu-latest] python-version: [3.9] toolchain: - - {compiler: gcc, version: 10} - - {compiler: gcc, version: 11} - - {compiler: gcc, version: 12} + # - {compiler: gcc, version: 12} - {compiler: gcc, version: 13} - - {compiler: intel, version: '2024.2'} - - {compiler: intel, version: '2023.2'} + # - {compiler: intel, version: '2024.2'} + # - {compiler: intel, version: '2023.2'} steps: - name: Checkout code uses: actions/checkout@v2 @@ -46,7 +44,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install ford numpy matplotlib gcovr numpy scipy + pip install ford numpy matplotlib gcovr numpy scipy coverage if [ -f requirements.txt ]; then pip install -r requirements.txt; fi sudo apt-get install libnlopt-dev @@ -67,10 +65,11 @@ jobs: - name: Upload coverage reports to Codecov if: ${{ env.FC == 'gfortran' }} - uses: codecov/codecov-action@v4.4.0 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} slug: ipqa-research/yaeos + files: "coverage.xml" Python-API: runs-on: ${{ matrix.os }} @@ -135,7 +134,7 @@ jobs: id: setup-fortran with: compiler: gcc - version: 12 + version: 13 # Install fpm for Windows - name: Install fpm diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ecd98dc75..1f7c694b8 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -6,18 +6,21 @@ jobs: documentation: runs-on: ubuntu-22.04 - env: - FC: gfortran - GCC_V: 12 - steps: - name: Checkout code uses: actions/checkout@v3 + - name: Setup Fortran Compiler + uses: fortran-lang/setup-fortran@v1 + id: setup-fortran + with: + compiler: "gcc" + version: 13 + - name: Install Dependencies Ubuntu run: | sudo apt-get update - sudo apt install -y gfortran-${GCC_V} python3-dev graphviz pandoc + sudo apt install -y python3-dev graphviz pandoc sudo pip install ford markdown pip install -r python/docs/requirements.txt pip install -r python/requirements-build.txt diff --git a/.gitignore b/.gitignore index 376507516..925bf9fbc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.whl fitting_data +ge_test_vals.txt co2 plot* model.py @@ -91,3 +92,29 @@ lnphi.gnu sweep err bench +GPECIN.DAT +GPECOUT.DAT +gpecplot.gp +save.DAT +fla.py +script.py +python/playground.ipynb +clap +cos +env +envlog +lg +pl +asd +coso +envlops +f +pt +pt_cp +pt_hpl +gpec_cl1.dat +gpec_cl2.dat +gpec_cl3.dat +gpec_psat1.dat +gpec_psat2.dat +gpecout diff --git a/app/ge_python_test_values.f90 b/app/ge_python_test_values.f90 new file mode 100644 index 000000000..db84a6b4f --- /dev/null +++ b/app/ge_python_test_values.f90 @@ -0,0 +1,199 @@ +program ge_test_values + use yaeos, only: pr, GeModel + + use yaeos, only: NRTL + use yaeos, only: setup_unifac, UNIFAC, Groups + use yaeos, only: setup_uniquac, UNIQUAC + implicit none + + integer, parameter :: nmodels = 3, nc = 3, file=10 + + ! Properties + real(pr) :: Ge, GeT, GeT2, Gen(nc), GeTn(nc), Gen2(nc, nc) + real(pr) :: He, HeT, Hen(nc) + real(pr) :: Se, SeT, Sen(nc) + real(pr) :: lngamma(nc), dlngamma_dT(nc), dlngamma_dn(nc, nc) + + ! NRTL + type(NRTL) :: nrtl_model + real(pr) :: a(nc, nc), b(nc, nc), c(nc, nc) + + ! UNIFAC + type(UNIFAC) :: unifac_model + type(Groups) :: molecules(nc) + + ! UNIQUAC + type(UNIQUAC) :: uniquac_model + real(pr) :: aij(nc, nc), bij(nc, nc), cij(nc, nc), dij(nc, nc), eij(nc, nc) + real(pr) :: rs(nc), qs(nc) + + real(pr) :: n(nc), T + + integer :: i + + ! ========================================================================== + ! Set up the models + ! -------------------------------------------------------------------------- + ! NRTL + a(1, :) = [0.0_pr, -0.801_pr, -0.351_pr] + a(2, :) = [-0.523_pr, 0.0_pr, 0.214_pr] + a(3, :) = [0.127_pr, 0.211_pr, 0.0_pr] + + b(1, :) = [0.0_pr, -586.1_pr, 246.2_pr] + b(2, :) = [301.2_pr, 0.0_pr, -104.2_pr] + b(3, :) = [150.23_pr, -114.78_pr, 0.0_pr] + + c(1, :) = [0.0_pr, 0.3_pr, 0.3_pr] + c(2, :) = [0.3_pr, 0.0_pr, 0.3_pr] + c(3, :) = [0.3_pr, 0.3_pr, 0.0_pr] + + nrtl_model = NRTL(a, b, c) + + ! UNIFAC + ! Hexane [CH3, CH2] + molecules(1)%groups_ids = [1, 2] + molecules(1)%number_of_groups = [2, 4] + + ! Ethanol [CH3, CH2, OH] + molecules(2)%groups_ids = [1, 2, 14] + molecules(2)%number_of_groups = [1, 1, 1] + + ! Toluene [ACH, ACCH3] + molecules(3)%groups_ids = [9, 11] + molecules(3)%number_of_groups = [5, 1] + + unifac_model = setup_unifac(molecules) + + ! UNIQUAC + aij(1,:) = [0.0_pr, -75.46_pr, -60.15_pr] + aij(2,:) = [120.20_pr, 0.0_pr, 44.22_pr] + aij(3,:) = [120.20_pr, 33.21_pr, 0.0_pr] + + bij(1,:) = [0.0_pr, -0.10062_pr, 0.2566_pr] + bij(2,:) = [0.44835_pr, 0.0_pr, -0.01325_pr] + bij(3,:) = [0.44835_pr, 0.124_pr, 0.0_pr] + + cij(1,:) = [0.0_pr, -0.0008052_pr, 0.00021_pr] + cij(2,:) = [0.0004704_pr, 0.0_pr, -0.00033_pr] + cij(3,:) = [0.0004704_pr, -0.000247_pr, 0.0_pr] + + dij(1,:) = [0.0_pr, -0.001_pr, 0.0002_pr] + dij(2,:) = [-0.001_pr, 0.0_pr, 0.0002_pr] + dij(3,:) = [-0.001_pr, 0.0002_pr, 0.0_pr] + + eij(1,:) = [0.0_pr, -0.00001_pr, 0.00001_pr] + eij(2,:) = [-0.00001_pr, 0.0_pr, 0.00001_pr] + eij(3,:) = [-0.00001_pr, 0.00001_pr, 0.0_pr] + + rs = [0.92_pr, 2.1055_pr, 1.5_pr] + qs = [1.4_pr, 1.972_pr, 1.4_pr] + + uniquac_model = setup_uniquac(qs, rs, aij, bij, cij, dij, eij) + + ! ========================================================================== + ! Generate test values + ! -------------------------------------------------------------------------- + n = [15.9754_pr, 3.125_pr, 24.6721_pr] + T = 320.0_pr + + ! Open file + open(& + unit=file, file="ge_test_vals.txt", status="REPLACE", action="WRITE" & + ) + + ! ========================================================================== + ! NRTL + ! -------------------------------------------------------------------------- + call nrtl_model%excess_gibbs(& + n, T, Ge=Ge, GeT=GeT, GeT2=GeT2, Gen=Gen, GeTn=GeTn, Gen2=Gen2 & + ) + + call nrtl_model%excess_enthalpy(& + n, T, He=He, HeT=HeT, Hen=Hen & + ) + + call nrtl_model%excess_entropy(& + n, T, Se=Se, SeT=SeT, Sen=Sen & + ) + + call nrtl_model%ln_activity_coefficient(& + n, T, lngamma=lngamma, dlngammadT=dlngamma_dT, dlngammadn=dlngamma_dn& + ) + + write(file, *) "NRTL", ",", Ge, ",", GeT, ",", GeT2, ",", Gen(1), ",", & + Gen(2), ",", Gen(3), ",", GeTn(1), ",", GeTn(2), ",", GeTn(3), ",", & + Gen2(1, 1), ",", Gen2(1, 2), ",", Gen2(1, 3), ",", Gen2(2, 1), ",", & + Gen2(2, 2), ",", Gen2(2, 3), ",", Gen2(3, 1), ",", Gen2(3, 2), ",", & + Gen2(3, 3), ",", He, ",", HeT, ",", Hen(1), ",", Hen(2), ",", Hen(3), & + ",", Se, ",", SeT, ",", Sen(1), ",", Sen(2), ",", Sen(3), ",", & + lngamma(1), ",", lngamma(2), ",", lngamma(3), ",", & + dlngamma_dT(1), ",", dlngamma_dT(2), ",", dlngamma_dT(3), ",", & + dlngamma_dn(1, 1), ",", dlngamma_dn(1, 2), ",", dlngamma_dn(1, 3), ",", & + dlngamma_dn(2, 1), ",", dlngamma_dn(2, 2), ",", dlngamma_dn(2, 3), ",", & + dlngamma_dn(3, 1), ",", dlngamma_dn(3, 2), ",", dlngamma_dn(3, 3) + + ! ========================================================================== + ! UNIFAC + ! -------------------------------------------------------------------------- + call unifac_model%excess_gibbs(& + n, T, Ge=Ge, GeT=GeT, GeT2=GeT2, Gen=Gen, GeTn=GeTn, Gen2=Gen2 & + ) + + call unifac_model%excess_enthalpy(& + n, T, He=He, HeT=HeT, Hen=Hen & + ) + + call unifac_model%excess_entropy(& + n, T, Se=Se, SeT=SeT, Sen=Sen & + ) + + call unifac_model%ln_activity_coefficient(& + n, T, lngamma=lngamma, dlngammadT=dlngamma_dT, dlngammadn=dlngamma_dn& + ) + + write(file, *) "UNIFAC", ",", Ge, ",", GeT, ",", GeT2, ",", Gen(1), ",", & + Gen(2), ",", Gen(3), ",", GeTn(1), ",", GeTn(2), ",", GeTn(3), ",", & + Gen2(1, 1), ",", Gen2(1, 2), ",", Gen2(1, 3), ",", Gen2(2, 1), ",", & + Gen2(2, 2), ",", Gen2(2, 3), ",", Gen2(3, 1), ",", Gen2(3, 2), ",", & + Gen2(3, 3), ",", He, ",", HeT, ",", Hen(1), ",", Hen(2), ",", Hen(3), & + ",", Se, ",", SeT, ",", Sen(1), ",", Sen(2), ",", Sen(3), ",", & + lngamma(1), ",", lngamma(2), ",", lngamma(3), ",", & + dlngamma_dT(1), ",", dlngamma_dT(2), ",", dlngamma_dT(3), ",", & + dlngamma_dn(1, 1), ",", dlngamma_dn(1, 2), ",", dlngamma_dn(1, 3), ",", & + dlngamma_dn(2, 1), ",", dlngamma_dn(2, 2), ",", dlngamma_dn(2, 3), ",", & + dlngamma_dn(3, 1), ",", dlngamma_dn(3, 2), ",", dlngamma_dn(3, 3) + + ! ========================================================================== + ! UNIQUAC + ! -------------------------------------------------------------------------- + call uniquac_model%excess_gibbs(& + n, T, Ge=Ge, GeT=GeT, GeT2=GeT2, Gen=Gen, GeTn=GeTn, Gen2=Gen2 & + ) + + call uniquac_model%excess_enthalpy(& + n, T, He=He, HeT=HeT, Hen=Hen & + ) + + call uniquac_model%excess_entropy(& + n, T, Se=Se, SeT=SeT, Sen=Sen & + ) + + call uniquac_model%ln_activity_coefficient(& + n, T, lngamma=lngamma, dlngammadT=dlngamma_dT, dlngammadn=dlngamma_dn& + ) + + write(file, *) "UNIQUAC", ",", Ge, ",", GeT, ",", GeT2, ",", Gen(1), ",", & + Gen(2), ",", Gen(3), ",", GeTn(1), ",", GeTn(2), ",", GeTn(3), ",", & + Gen2(1, 1), ",", Gen2(1, 2), ",", Gen2(1, 3), ",", Gen2(2, 1), ",", & + Gen2(2, 2), ",", Gen2(2, 3), ",", Gen2(3, 1), ",", Gen2(3, 2), ",", & + Gen2(3, 3), ",", He, ",", HeT, ",", Hen(1), ",", Hen(2), ",", Hen(3), & + ",", Se, ",", SeT, ",", Sen(1), ",", Sen(2), ",", Sen(3), ",", & + lngamma(1), ",", lngamma(2), ",", lngamma(3), ",", & + dlngamma_dT(1), ",", dlngamma_dT(2), ",", dlngamma_dT(3), ",", & + dlngamma_dn(1, 1), ",", dlngamma_dn(1, 2), ",", dlngamma_dn(1, 3), ",", & + dlngamma_dn(2, 1), ",", dlngamma_dn(2, 2), ",", dlngamma_dn(2, 3), ",", & + dlngamma_dn(3, 1), ",", dlngamma_dn(3, 2), ",", dlngamma_dn(3, 3) + + ! Close file + close(file) +end program ge_test_values diff --git a/app/gpec.f90 b/app/gpec.f90 index 2f7b20155..e47c35f8f 100644 --- a/app/gpec.f90 +++ b/app/gpec.f90 @@ -9,20 +9,22 @@ program gpec type(Substance) :: sus(nc) !! Substances class(ArModel), allocatable :: model !! Thermodynamic model to use - type(EquilibriumState) :: sat_point !! Saturation point type(EquilibriumState) :: cp !! Individual critical point - type(PTEnvel2) :: psats(2) !! Saturation curves - type(CriticalLine) :: cl + type(CriticalLine) :: cl21 !! Critical line 2 -> 1 + type(CriticalLine) :: cl12 !! Critical line 1 -> 2 + type(CriticalLine) :: clll !! Critical line LL + type(PurePsat) :: psats(2) !! Pure component saturation lines real(pr) :: z(nc) !! Molar fractions real(pr) :: a !! Fraction between component 1 and 2 - real(pr), parameter :: eps = 1e-300 - real(pr), parameter :: z0(nc) = [1-eps, eps] !! Component 1 molar fractions - real(pr), parameter :: zi(nc) = [eps, 1-eps] !! Component 2 molar fractions + real(pr), parameter :: eps = 1e-3 + real(pr), parameter :: z0(nc) = [1, 0] !! Component 1 molar fractions + real(pr), parameter :: zi(nc) = [0, 1] !! Component 2 molar fractions real(pr) :: P !! Pressure [bar] real(pr) :: T !! Temperature [K] real(pr) :: V !! Volume [L/mol] - real(pr) :: S + real(pr) :: S !! Specification + real(pr) :: HPLL_P = 1000 !! High pressure limit for LLV integer :: diagram_type !! Diagram type @@ -30,103 +32,86 @@ program gpec forsus_dir = "build/dependencies/forsus/" // forsus_default_dir + call system("rm gpec_*") + ! =========================================================================== ! Set up the model ! --------------------------------------------------------------------------- - ! model = get_model_nrtl_mhv() sus(1) = Substance("methane") - sus(2) = Substance("carbon dioxide") + sus(2) = Substance("propane") model = PengRobinson76(& Tc=sus%critical%critical_temperature%value, & Pc=sus%critical%critical_pressure%value/1e5, & w=sus%critical%acentric_factor%value & ) + !model = get_model_nrtl_mhv() + model = get_modelgerg() ! =========================================================================== ! Calculate both saturation curves ! --------------------------------------------------------------------------- - print *, model%components%Tc - print *, model%components%Pc - do i=0,1 - S = i - z = zi*S + z0*(1-S) - sat_point = critical_point(model, z0, zi, S=S, spec=spec_CP%a, max_iters=1000, a0=S) - - select case(i) - case(0) - sat_point = saturation_pressure(model, z, T=100._pr, kind="bubble") - case(1) - sat_point = saturation_pressure(model, z, T=100._pr, kind="bubble") - end select - - psats(i+1) = pt_envelope_2ph(model, z, sat_point, delta_0=0.001_pr) - end do + psats(1) = pure_saturation_line(model, 1, 1._pr, 100._pr) + psats(2) = pure_saturation_line(model, 2, 1._pr, 100._pr) - print *, "Psat 1" - open(unit=1, file="gpec_psat1.dat") - do i=1,size(psats(1)%points) - write(1, *) psats(1)%points(i)%T, psats(1)%points(i)%P + open(unit=1, file="gpec_Psat1.dat") + do i=1,size(psats(1)%T) + write(1, *) psats(1)%T(i), psats(1)%P(i), psats(1)%Vx(i), psats(1)%Vy(i) end do close(1) - print *, "" - print *, "" - - print *, "Psat 2" - open(unit=1, file="gpec_psat2.dat") - do i=1,size(psats(2)%points) - print *, psats(2)%points(i)%T, psats(2)%points(i)%P + open(unit=1, file="gpec_Psat2.dat") + do i=1,size(psats(2)%T) + write(1, *) psats(2)%T(i), psats(2)%P(i), psats(2)%Vx(i), psats(2)%Vy(i) end do - close(2) + close(1) ! =========================================================================== ! Calculate the first critical line (2 -> 1) ! --------------------------------------------------------------------------- - cl = critical_line(model, a0=0.99_pr, z0=z0, zi=zi, ns=spec_CP%a, S=0.99_pr, dS0=-0.01_pr) - open(unit=1, file="gpec_cl2.dat") - do i=1,size(cl%a) - write(1, *) cl%a(i), cl%T(i), cl%P(i), cl%V(i) - end do + cl21 = critical_line(model, a0=0.99_pr, z0=z0, zi=zi, ns=spec_CP%a, S=0.99_pr, dS0=-0.01_pr, maxP=HPLL_P) + open(unit=1, file="gpec_cl21.dat") + call write_cl(cl21) close(1) + if (abs(cl21%P(size(cl21%a)) - model%components%Pc(1)) > 0.1_pr) then + ! ======================================================================== + ! Calculate the second critical line (1 -> 2) + ! ------------------------------------------------------------------------ + cl12 = critical_line(model, a0=0.001_pr, z0=z0, zi=zi, ns=spec_CP%a, S=0.001_pr, dS0=0.001_pr) + open(unit=1, file="gpec_cl12.dat") + call write_cl(cl12) + close(1) + else + diagram_type = 1 + end if - cl = critical_line(model, a0=0.001_pr, z0=z0, zi=zi, ns=spec_CP%a, S=0.001_pr, dS0=0.001_pr) - open(unit=1, file="gpec_cl1.dat") - do i=1,size(cl%a) - write(1, *) cl%a(i), cl%T(i), cl%P(i), cl%V(i) - end do - close(1) - - cp = critical_point(model, z0, zi, S=log(200._pr), spec=spec_CP%P, max_iters=1000, a0=0.5_pr) - - !TODO: Si inicializo con S=200 converge a otro lado, ver por qué pasa! - cl = critical_line(model, a0=cp%x(2), z0=z0, zi=zi, ns=spec_CP%P, S=log(cp%P), dS0=-0.01_pr) - open(unit=1, file="gpec_cl3.dat") - do i=1,size(cl%a) - write(1, *) cl%a(i), cl%T(i), cl%P(i), cl%V(i) - end do - close(1) - print *, cp%iters, cp - - - - - call exit - - call plot_pts([(real(i,pr)/100, i=1,99,10)]) - if (cl%a(size(cl%a)) < 1e-3) then + if (diagram_type == 1) then type_1_or_2 : block ! Search for LLV - ! IF LLV - diagram_type = 1 - ! ELSE - diagram_type = 2 + !TODO: Si inicializo con S=200 converge a otro lado, ver por qué pasa! + ! Converge a critical point at high pressure + cp = critical_point(model, z0, zi, S=log(HPLL_P), spec=spec_CP%P, max_iters=1000, a0=0.5_pr) + clll = critical_line(model, a0=cp%x(2), z0=z0, zi=zi, ns=spec_CP%P, S=log(cp%P), dS0=-0.01_pr) + open(unit=1, file="gpec_clll.dat") + call write_cl(clll) + close(1) + if (size(clll%a) > 1) then + diagram_type = 2 + else + end if end block type_1_or_2 else - + diagram_type = 3 end if + ! =========================================================================== + ! Now with the global diagram information, calculate specific points + ! --------------------------------------------------------------------------- + + call plot_pts([(real(i,pr)/100, i=1,99,10)]) + call plot_pxs([(real(i, pr), i=150,int(model%components%Tc(2)),20)]) + call plot_txs([(real(i, pr), i=0,int(model%components%Pc(1)),50)]) contains type(CubicEoS) function get_model_nrtl_mhv() result(model) @@ -155,6 +140,12 @@ type(CubicEoS) function get_model_nrtl_mhv() result(model) model%mixrule = mr end function get_model_nrtl_mhv + type(GERG2008) function get_modelgerg() result(model) + integer :: ids(2) + ids = [G2008Components%methane, G2008Components%carbon_dioxide] + model = gerg_2008(ids) + end function get_modelgerg + subroutine plot_pts(zs) real(pr), intent(in) :: zs(:) type(EquilibriumState) :: sat @@ -162,15 +153,135 @@ subroutine plot_pts(zs) integer :: i real(pr) :: z(nc) + open(1, file="gpec_pts.dat") + write(1, *) "kind T P beta x1 x2 y1 y2 z1 z2" do i=1,size(zs) - z = z0*zs(i) + zi*(1-zs(i)) - sat = saturation_pressure(model, z, T=200._pr, kind="bubble") - env = pt_envelope_2ph(model, z, sat) - write(i+10, *) env + + z = [1-zs(i), zs(i)] + + sat = saturation_pressure(model, z, T=150._pr, kind="bubble") + env = pt_envelope_2ph(model, z, sat, points=1000) + call write_pt(env, z) sat = saturation_temperature(model, z, P=0.01_pr, kind="dew") - env = pt_envelope_2ph(model, z, sat) - write(i+10, *) env + env = pt_envelope_2ph(model, z, sat, points=1000) + call write_pt(env, z) + + write(1, *) + write(1, *) end do + close(1) end subroutine plot_pts + + subroutine plot_pxs(Ts) + real(pr), intent(in) :: Ts(:) + real(pr) :: a, z(nc) + integer :: i, j + integer :: loc + type(EquilibriumState) :: sat + type(PXEnvel2) :: px + + + open(unit=1, file="gpec_px.dat") + write(1, *) "kind T P beta x1 x2 y1 y2" + do i=1, size(Ts) + T = Ts(i) + + if (Ts(i) < model%components%Tc(1)) then + a = 0.0001_pr + z = a*zi + (1-a)*z0 + P = psats(1)%get_P(T) + sat = saturation_pressure(model, z, T, kind="bubble", P0=P) + px = px_envelope_2ph(model, z0=z0, alpha0=a, z_injection=zi, first_point=sat, delta_0=0.001_pr) + else if (Ts(i) < model%components%Tc(2)) then + a = 0.9999_pr + z = a*zi + (1-a)*z0 + P = psats(2)%get_P(T) + sat = saturation_pressure(model, z, T, kind="bubble", P0=P) + px = px_envelope_2ph(model, z0=z0, alpha0=a, z_injection=zi, first_point=sat, delta_0=-0.001_pr) + else + loc = minloc(abs(cl12%T - T), dim=1) + a = cl12%a(loc) + eps + z = a*zi + (1-a)*z0 + + end if + + do j=1,size(px%points) + write(1, *) px%points(j) + end do + write(1, *) + write(1, *) + end do + close(1) + + end subroutine plot_pxs + + subroutine plot_txs(Ps) + real(pr), intent(in) :: Ps(:) + real(pr) :: a, z(nc) + integer :: i, j + type(EquilibriumState) :: sat + type(TXEnvel2) :: tx + + open(unit=1, file="gpec_tx.dat") + write(1, *) "kind T P beta x1 x2 y1 y2" + + do i=1, size(Ps) + P = Ps(i) + + if (Ps(i) < model%components%Pc(2)) then + a = 0.9999_pr + z = a*zi + (1-a)*z0 + T = psats(2)%get_T(P) + sat = saturation_temperature(model, z, P, kind="dew", T0=T) + tx = tx_envelope_2ph(model, z0=z0, alpha0=a, z_injection=zi, first_point=sat, delta_0=-0.0001_pr) + call write_tx(tx) + + + if (tx%alpha(size(tx%alpha)) > 0.001_pr) then + ! In the case the line did not reach the light component + a = 0.0001_pr + z = a*zi + (1-a)*z0 + T = psats(1)%get_T(P) + sat = saturation_temperature(model, z, T, kind="dew", T0=T) + tx = tx_envelope_2ph(model, z0=z0, alpha0=a, z_injection=zi, first_point=sat, delta_0=0.0001_pr) + call write_tx(tx) + end if + end if + + end do + + close(1) + end subroutine plot_txs + + subroutine write_pt(pt, z) + type(PTEnvel2), intent(in) :: pt + real(pr), intent(in) :: z(nc) + integer :: j + do j=1,size(pt%points) + write(1, *) pt%points(j), z + end do + write(1, *) + write(1, *) + end subroutine write_pt + + subroutine write_tx (tx) + type(TXEnvel2), intent(in) :: tx + integer :: j + do j=1,size(tx%points) + write(1, *) tx%points(j) + end do + write(1, *) + write(1, *) + end subroutine write_tx + + subroutine write_cl(cl) + type(CriticalLine), intent(in) :: cl + integer :: j + do j=1,size(cl%a) + write(1, *) cl%a(j), cl%T(j), cl%P(j), cl%V(j) + end do + write(1, *) + write(1, *) + end subroutine write_cl end program gpec diff --git a/c_interface/yaeos_c.f90 b/c_interface/yaeos_c.f90 index 2724404b9..c45dc2d09 100644 --- a/c_interface/yaeos_c.f90 +++ b/c_interface/yaeos_c.f90 @@ -19,18 +19,22 @@ module yaeos_c private ! CubicEoS - public :: srk, pr76, pr78, rkpr, psrk + public :: srk, pr76, pr78, rkpr, psrk, get_ac_b_del1_del2 ! Mixing rules public :: set_mhv, set_qmr, set_qmrtd, set_hv ! __del__ public :: make_available_ar_models_list public :: make_available_ge_models_list - ! GeMoels + + ! GeModels public :: nrtl public :: unifac_vle public :: uniquac - public :: ln_gamma + public :: ln_gamma_ge + public :: excess_gibbs_ge + public :: excess_enthalpy_ge + public :: excess_entropy_ge ! Thermoprops public :: lnphi_vt, lnphi_pt, pressure, volume, enthalpy_residual_vt @@ -40,7 +44,8 @@ module yaeos_c ! Phase equilibria public :: flash, flash_grid public :: saturation_pressure, saturation_temperature - public :: pt2_phase_envelope + public :: pure_saturation_line + public :: pt2_phase_envelope, px2_phase_envelope public :: critical_point, critical_line public :: stability_zpt, tm @@ -70,6 +75,7 @@ module yaeos_c ! ========================================================================== ! Ge Models ! -------------------------------------------------------------------------- + ! NRTL subroutine nrtl(a, b, c, id) use yaeos, only: fNRTL => NRTL real(c_double), intent(in) :: a(:,:), b(:,:), c(:,:) @@ -78,36 +84,7 @@ subroutine nrtl(a, b, c, id) call extend_ge_models_list(id) end subroutine nrtl - subroutine setup_groups(nc, ngs, g_ids, g_v, molecules) - use yaeos, only: Groups - integer(c_int), intent(in) :: nc !! Number of components - integer(c_int), intent(in) :: ngs(nc) !! Number of groups at each molecule - integer(c_int), intent(in) :: g_ids(:, :) !! Ids of groups for each molecule - integer(c_int), intent(in) :: g_v(:, :) !! Number of groups for each molecule - type(Groups), intent(out) :: molecules(nc) - integer :: i - - do i=1,nc - molecules(i)%groups_ids = g_ids(i, :ngs(i)) - molecules(i)%number_of_groups = g_v(i, :ngs(i)) - end do - end subroutine setup_groups - - subroutine unifac_vle(id, nc, ngs, g_ids, g_v) - use yaeos, only: UNIFAC, setup_unifac, Groups - integer(c_int), intent(out) :: id !! Saved model id - integer(c_int), intent(in) :: nc !! Number of components - integer(c_int), intent(in) :: ngs(nc) !! Number of groups at each molecule - integer(c_int), intent(in) :: g_ids(:, :) !! Ids of groups for each molecule - integer(c_int), intent(in) :: g_v(:, :) !! Number of groups for each molecule - - type(Groups) :: molecules(nc) - - call setup_groups(nc, ngs, g_ids, g_v, molecules) - ge_model = setup_unifac(molecules) - call extend_ge_models_list(id) - end subroutine unifac_vle - + ! UNIQUAC subroutine uniquac(id, qs, rs, aij, bij, cij, dij, eij) use yaeos, only: setup_uniquac integer(c_int), intent(out) :: id @@ -130,6 +107,37 @@ subroutine uniquac(id, qs, rs, aij, bij, cij, dij, eij) call extend_ge_models_list(id) end subroutine uniquac + ! UNIFAC + subroutine unifac_vle(id, nc, ngs, g_ids, g_v) + use yaeos, only: UNIFAC, setup_unifac, Groups + integer(c_int), intent(out) :: id !! Saved model id + integer(c_int), intent(in) :: nc !! Number of components + integer(c_int), intent(in) :: ngs(nc) !! Number of groups at each molecule + integer(c_int), intent(in) :: g_ids(:, :) !! Ids of groups for each molecule + integer(c_int), intent(in) :: g_v(:, :) !! Number of groups for each molecule + + type(Groups) :: molecules(nc) + + call setup_groups(nc, ngs, g_ids, g_v, molecules) + ge_model = setup_unifac(molecules) + call extend_ge_models_list(id) + end subroutine unifac_vle + + subroutine setup_groups(nc, ngs, g_ids, g_v, molecules) + use yaeos, only: Groups + integer(c_int), intent(in) :: nc !! Number of components + integer(c_int), intent(in) :: ngs(nc) !! Number of groups at each molecule + integer(c_int), intent(in) :: g_ids(:, :) !! Ids of groups for each molecule + integer(c_int), intent(in) :: g_v(:, :) !! Number of groups for each molecule + type(Groups), intent(out) :: molecules(nc) + integer :: i + + do i=1,nc + molecules(i)%groups_ids = g_ids(i, :ngs(i)) + molecules(i)%number_of_groups = g_v(i, :ngs(i)) + end do + end subroutine setup_groups + subroutine extend_ge_models_list(id) !! Find the first available model container and allocate the model !! there. Then return the found id. @@ -155,17 +163,88 @@ subroutine make_available_ge_models_list(id) free_ge_model(id) = .true. end subroutine make_available_ge_models_list - subroutine ln_gamma(id, n, T, lngamma) + ! Ge Thermoprops + subroutine excess_gibbs_ge(id, n, T, Ge, GeT, GeT2, Gen, GeTn, Gen2) integer(c_int), intent(in) :: id real(c_double), intent(in) :: n(:) + !! Moles vector real(c_double), intent(in) :: T + !! Temperature [K] + real(c_double), intent(out) :: Ge + !! Excess gibbs energy + real(c_double), optional, intent(inout) :: GeT + !! \(\frac{dG^E}{dT}\) + real(c_double), optional, intent(inout) :: GeT2 + !! \(\frac{d^2G^E}{dT^2}\) + real(c_double), optional, intent(inout) :: Gen(size(n)) + !! \(\frac{dG^E}{dn_i}\) + real(c_double), optional, intent(inout) :: GeTn(size(n)) + !! \(\frac{d^2G^E}{dTdn_i}\) + real(c_double), optional, intent(inout) :: Gen2(size(n), size(n)) + !! \(\frac{d^2G^E}{dn_idn_j}\) + + call ge_models(id)%model%excess_gibbs(& + n, T, Ge=Ge, GeT=GeT, GeT2=GeT2, Gen=Gen, GeTn=GeTn, Gen2=Gen2 & + ) + end subroutine excess_gibbs_ge + + subroutine ln_gamma_ge(id, n, T, lngamma, dlngamma_dt, dlngamma_dn) + integer(c_int), intent(in) :: id + real(c_double), intent(in) :: n(:) + !! Moles vector + real(c_double), intent(in) :: T + !! Temperature [K] real(c_double), intent(out) :: lngamma(size(n)) - call ge_models(id)%model%ln_activity_coefficient(n, T, lngamma) - end subroutine ln_gamma + !! Natural logarithm of activity coefficients + real(c_double), optional, intent(inout) :: dlngamma_dt(size(n)) + !! \(\frac{d\ln \gamma_i}{dT}\) + real(c_double), optional, intent(inout) :: dlngamma_dn(size(n),size(n)) + !! \(\frac{d\ln \gamma_i}{dn_j}\) + + call ge_models(id)%model%ln_activity_coefficient(& + n, T, lngamma=lngamma, dlngammadT=dlngamma_dt, dlngammadn=dlngamma_dn& + ) + end subroutine ln_gamma_ge - ! ============================================================================= + subroutine excess_enthalpy_ge(id, n, T, He, HeT, Hen) + integer(c_int), intent(in) :: id + real(c_double), intent(in) :: n(:) + !! Moles vector + real(c_double), intent(in) :: T + !! Temperature [K] + real(c_double), intent(out) :: He + !! Excess enthalpy + real(c_double), optional, intent(inout) :: HeT + !! \(\frac{dH^E}{dT}\) + real(c_double), optional, intent(inout) :: Hen(size(n)) + !! \(\frac{dH^E}{dn}\) + + call ge_models(id)%model%excess_enthalpy(& + n, T, He=He, HeT=HeT, Hen=Hen & + ) + end subroutine excess_enthalpy_ge + + subroutine excess_entropy_ge(id, n, T, Se, SeT, Sen) + integer(c_int), intent(in) :: id + real(c_double), intent(in) :: n(:) + !! Moles vector + real(c_double), intent(in) :: T + !! Temperature [K] + real(c_double), intent(out) :: Se + !! Excess entropy + real(c_double), optional, intent(inout) :: SeT + !! \(\frac{dS^E}{dT}\) + real(c_double), optional, intent(inout) :: Sen(size(n)) + !! \(\frac{dS^E}{dn}\) + + call ge_models(id)%model%excess_entropy(& + n, T, Se=Se, SeT=SeT, Sen=Sen & + ) + end subroutine excess_entropy_ge + + ! ========================================================================== ! Ar Models - ! ----------------------------------------------------------------------------- + ! -------------------------------------------------------------------------- subroutine extend_ar_models_list(id) !! Find the first available model container and allocate the model !! there. Then return the found id. @@ -337,6 +416,25 @@ subroutine psrk(id, nc, tc, pc, w, c1, c2, c3, ngs, g_ids, g_v) call extend_ar_models_list(id) end subroutine psrk + subroutine get_ac_b_del1_del2(id, ac, b, del1, del2, nc) + use yaeos, only: CubicEoS, size + integer(c_int), intent(in) :: id + integer, intent(in) :: nc + real(c_double), dimension(nc), intent(out) :: & + ac, b, del1, del2 + + + associate(model => ar_models(id)%model) + select type(model) + class is(CubicEoS) + ac(:nc) = model%ac + b(:nc) = model%b + del1(:nc) = model%del1 + del2(:nc) = model%del2 + end select + end associate + end subroutine get_ac_b_del1_del2 + ! ========================================================================== ! Thermodynamic properties ! -------------------------------------------------------------------------- @@ -477,14 +575,14 @@ subroutine critical_point(id, z0, zi, spec, max_iters, x, T, P, V) crit = fcritical_point(& model=ar_models(id)%model, z0=z0, zi=zi, & S=S, spec=spec, max_iters=max_iters & - ) + ) call equilibria_state_to_arrays(crit, x, y, P, T, V, Vy, beta) end subroutine critical_point subroutine critical_line(& - id, a0, da0, & - z0, zi, max_points, & - as, Vs, Ts, Ps) + id, a0, da0, & + z0, zi, max_points, stop_pressure, & + as, Vs, Ts, Ps) use yaeos, only: EquilibriumState, CriticalLine, & fcritical_line => critical_line, spec_CP integer(c_int), intent(in) :: id @@ -493,6 +591,7 @@ subroutine critical_line(& real(c_double), intent(in) :: a0 real(c_double), intent(in) :: da0 integer, intent(in) :: max_points + real(c_double), intent(in) :: stop_pressure real(c_double), intent(out) :: as(max_points) real(c_double), intent(out) :: Ts(max_points) real(c_double), intent(out) :: Ps(max_points) @@ -510,7 +609,7 @@ subroutine critical_line(& cl = fcritical_line(& model=ar_models(id)%model, a0=a0, & z0=z0, zi=zi, & - ns=spec_CP%a, S=a0, ds0=da0) + ns=spec_CP%a, S=a0, ds0=da0, maxp=stop_pressure, max_points=max_points) do i=1,size(cl%a) as(i) = cl%a(i) @@ -628,10 +727,44 @@ subroutine saturation_temperature(id, z, P, kind, T0, T, x, y, Vx, Vy, beta) call equilibria_state_to_arrays(sat, x, y, aux, T, Vx, Vy, beta) end subroutine saturation_temperature + subroutine pure_saturation_line(id, comp_id, stop_P, stop_T, P, T, Vx, Vy) + use yaeos, only: fsat => pure_saturation_line, PurePsat, pr + integer(c_int), intent(in) :: id + integer(c_int), intent(in) :: comp_id + real(c_double), intent(in) :: stop_P + real(c_double), intent(in) :: stop_T + real(c_double), intent(out) :: P(800) + real(c_double), intent(out) :: T(800) + real(c_double), intent(out) :: Vx(800) + real(c_double), intent(out) :: Vy(800) + + integer :: npoints + type(PurePsat) :: sat + + real(8) :: nan + + nan = 0 + nan = nan/nan + + T = nan + P = nan + Vx = nan + Vy = nan + + sat = fsat(ar_models(id)%model, comp_id, stop_P, stop_T) + + npoints = minval([size(sat%T), 800]) + + T(:npoints) = sat%T(:npoints) + P(:npoints) = sat%P(:npoints) + Vx(:npoints) = sat%Vx(:npoints) + Vy(:npoints) = sat%Vy(:npoints) + end subroutine pure_saturation_line + subroutine pt2_phase_envelope(id, z, kind, max_points, Ts, Ps, tcs, pcs, T0, P0) use yaeos, only: & saturation_pressure, saturation_temperature, pt_envelope_2ph, & - EquilibriumState, PTEnvel2 + EquilibriumState, PTEnvel2, find_hpl integer(c_int), intent(in) :: id real(c_double), intent(in) :: z(:) integer, intent(in) :: max_points @@ -671,14 +804,16 @@ subroutine pt2_phase_envelope(id, z, kind, max_points, Ts, Ps, tcs, pcs, T0, P0) select case(kind) case("bubble") sat = saturation_pressure(ar_models(id)%model, z, T=T, kind=kind) + env = pt_envelope_2ph(ar_models(id)%model, z, sat, points=max_points) case("dew") sat = saturation_temperature(ar_models(id)%model, z, P=P, kind=kind) + env = pt_envelope_2ph(ar_models(id)%model, z, sat, points=max_points) case("liquid-liquid") - sat = saturation_temperature(ar_models(id)%model, z, P=P, kind=kind) + ! sat = saturation_temperature(ar_models(id)%model, z, P=P, kind=kind) + env = find_hpl(ar_models(id)%model, z, T, P) end select - env = pt_envelope_2ph(ar_models(id)%model, z, sat, points=max_points) i = size(env%points) Ts(:i) = env%points%T Ps(:i) = env%points%P @@ -688,6 +823,62 @@ subroutine pt2_phase_envelope(id, z, kind, max_points, Ts, Ps, tcs, pcs, T0, P0) Pcs(:i) = env%cps%P end subroutine pt2_phase_envelope + subroutine px2_phase_envelope(& + id, z0, zi, kind, max_points, T, P0, ds0, & + as, Ps, xs, ys, acs, pcs, a0, kinds) + use yaeos, only: & + saturation_pressure, saturation_temperature, px_envelope_2ph, & + EquilibriumState, PXEnvel2 + integer(c_int), intent(in) :: id + real(c_double), intent(in) :: z0(:) + real(c_double), intent(in) :: zi(:) + integer, intent(in) :: max_points + character(len=15), intent(in) :: kind + real(c_double), intent(in) :: T + real(c_double), intent(in) :: ds0 + real(c_double), intent(out) :: as(max_points) + real(c_double), intent(out) :: Ps(max_points) + real(c_double), intent(out) :: xs(max_points, size(z0)) + real(c_double), intent(out) :: ys(max_points, size(z0)) + real(c_double), intent(in) :: a0 + real(c_double), intent(out) :: acs(5), Pcs(5) + real(c_double), intent(in) :: P0 + character(len=15), intent(out) :: kinds(max_points) + + real(8) :: nan + type(EquilibriumState) :: sat + type(PXEnvel2) :: env + + integer :: i, j + + real(c_double) :: z(size(z0)) + + nan = makenan() + as = nan + Ps = nan + acs = nan + Pcs = nan + + z = a0 * zi + (1-a0)*z0 + + sat = saturation_pressure(ar_models(id)%model, z, T=T, kind=kind, P0=P0) + env = px_envelope_2ph(ar_models(id)%model, z0=z0, alpha0=a0, z_injection=zi, first_point=sat, points=max_points, delta_0=ds0) + + i = size(env%points) + as(:i) = env%alpha + Ps(:i) = env%points%P + + do j=1,i + xs(j, :) = env%points(j)%x + ys(j, :) = env%points(j)%y + end do + + i = size(env%cps) + acs(:i) = env%cps%alpha + Pcs(:i) = env%cps%P + kinds = env%points%kind + end subroutine px2_phase_envelope + subroutine flash_grid(id, z, Ts, Ps, xs, ys, Vxs, Vys, betas, parallel) use yaeos, only: EquilibriumState, flash integer(c_int), intent(in) :: id @@ -710,7 +901,7 @@ subroutine flash_grid(id, z, Ts, Ps, xs, ys, Vxs, Vys, betas, parallel) nt = size(Ts) if (parallel) then - !$OMP PARALLEL DO PRIVATE(i, j, t, p, flash_result) SHARED(model, z, ts, ps, betas, Vxs, Vys, xs, ys) + !$OMP PARALLEL DO PRIVATE(i, j, t, p, flash_result) SHARED(model, z, ts, ps, betas, Vxs, Vys, xs, ys) do i=1,np do j=1,nt T = Ts(j) @@ -732,6 +923,7 @@ subroutine flash_grid(id, z, Ts, Ps, xs, ys, Vxs, Vys, betas, parallel) P = Ps(i) flash_result = flash(model, z, T=T, P_spec=P, iters=iter) betas(i, j) = flash_result%beta + print *, i, j, flash_result%iters, flash_result%beta Vxs(i, j) = flash_result%Vx Vys(i, j) = flash_result%Vy @@ -742,18 +934,31 @@ subroutine flash_grid(id, z, Ts, Ps, xs, ys, Vxs, Vys, betas, parallel) end if end subroutine flash_grid - subroutine stability_zpt(id, z, P, T, w_min, tm_val, all_mins) - use yaeos, only: min_tpd + subroutine stability_zpt(id, z, P, T, w_min, min_tm, tm_vals, all_mins) + use yaeos, only: min_tpd, tm integer(c_int), intent(in) :: id real(c_double), intent(in) :: z(:), P, T real(c_double), intent(out) :: w_min(size(z)) - real(c_double), intent(out) :: tm_val + real(c_double), intent(out) :: min_tm + real(c_double), intent(out) :: tm_vals(size(z)) real(c_double), intent(out) :: all_mins(size(z), size(z)) + real(c_double) :: d_i(size(z)) + + integer :: i + call min_tpd(& ar_models(id)%model, z=z, P=P, T=T, & - mintpd=tm_val, w=w_min, all_minima=all_mins) - end subroutine + mintpd=min_tm, w=w_min, all_minima=all_mins & + ) + + call ar_models(id)%model%lnphi_pt(n=z, P=T, T=T, root_type="stable", lnPhi=d_i) + + d_i = log(z) + d_i + do i=1,size(z) + tm_vals(i) = tm(ar_models(id)%model, z, all_mins(i, :), P, T, d=d_i) + end do + end subroutine stability_zpt subroutine tm(id, z, w, P, T, tm_value) use yaeos, only: ftm => tm @@ -762,7 +967,7 @@ subroutine tm(id, z, w, P, T, tm_value) real(c_double), intent(out) :: tm_value tm_value = ftm(model=ar_models(id)%model, z=z, w=w, P=P, T=T) - end subroutine + end subroutine tm ! ========================================================================== ! Auxiliar diff --git a/ci/ci.sh b/ci/ci.sh index bbe297c11..4eb27749d 100644 --- a/ci/ci.sh +++ b/ci/ci.sh @@ -41,7 +41,7 @@ run_test() { echoerr "There are wrongly named files in the test directory" echo Running tests... - fpm test --flag "--coverage" + fpm test --flag "--coverage -g" || exit 1 } run_coverage() { @@ -49,26 +49,26 @@ run_coverage() { --exclude "build" \ --exclude "test/test_runner.f90" \ --exclude "test/fixtures/taperobinson.f90" \ + --exclude "test" \ --exclude "src/adiff/hyperdual.f90" \ --exclude "example" \ --exclude "src/legacy/*" \ --exclude "src/models/excess_gibbs/nrtl.f90" \ --exclude "app"\ --exclude "tools" \ - --fail-under-line 90 \ --jacoco coverage.xml gcovr \ --exclude "build" \ --exclude "test/test_runner.f90" \ --exclude "test/fixtures/taperobinson.f90" \ + --exclude "test" \ --exclude "src/adiff/hyperdual.f90" \ --exclude "example" \ --exclude "src/legacy/*" \ --exclude "src/models/excess_gibbs/nrtl.f90" \ --exclude "app"\ - --exclude "tools" \ - --fail-under-line 90 + --exclude "tools" } python_wrappers(){ @@ -101,4 +101,4 @@ case $1 in run_test run_coverage resumee;; -esac \ No newline at end of file +esac diff --git a/codecov.yml b/codecov.yml index 6ab443af4..90ac6e8c9 100644 --- a/codecov.yml +++ b/codecov.yml @@ -12,7 +12,7 @@ coverage: flag_coverage_not_uploaded_behavior: include patch: default: - target: 80.0 + target: 90.0 project: default: target: 90.0 @@ -21,6 +21,7 @@ github_checks: ignore: - build + - test - test/test_runner.f90 - test/fixtures/taperobinson.f90 - src/adiff/hyperdual.f90 diff --git a/doc/page/usage/excessmodels/index.md b/doc/page/usage/excessmodels/index.md index 397e3a111..0da10d30d 100644 --- a/doc/page/usage/excessmodels/index.md +++ b/doc/page/usage/excessmodels/index.md @@ -2,4 +2,206 @@ title: Gibbs Excess Models --- -Explain thermoprops of Ge models here \ No newline at end of file +[TOC] + +# Gibbs Excess Models + +Excess properties are properties of mixtures which quantify the non-ideal +behavior of real mixtures. They are defined as the difference between the value +of the property in a real mixture and the value that would exist in an ideal +solution under the same conditions. + +$$ + G^E = G - G^{I,S} = \Delta G_{mix} +$$ + +$$ + H^E = H - H^{I,S} = \Delta H_{mix} +$$ + +$$ + S^E = H - H^{I,S} = \Delta S_{mix} +$$ + +Gibbs excess models are defined in terms of a mathematical expression that +describes the excess Gibbs energy of a mixture as a function of the composition +of the components in the mixture and temperature. Then, the other excess +properties can be derived from the excess Gibbs energy derivatives. + + +## Routines and Methods +### \( \ln \gamma_i \) + +Activity coefficients are calculated from the excess Gibbs energy using the +following expression: + +$$ + \ln \gamma_i = \frac{\partial \left(\frac{G^E}{RT} \right)}{\partial n_i} +$$ + +#### \( \ln \gamma_i \) derivatives + +The derivatives of the activity coefficients with respect to the mole numbers: + +$$ + \frac{\partial \ln \gamma_i}{\partial n_j} = \frac{\partial^2 \left(\frac{G^E}{RT} \right)}{\partial n_i \partial n_j} +$$ + +The temperature derivative of the activity coefficients: + +$$ + \frac{\partial \ln \gamma_i}{\partial T} = \frac{\partial^2 + \left(\frac{G^E}{RT} \right)}{\partial n_i \partial T} = + \frac{1}{RT} \left( + \frac{\partial^2 G^E}{\partial n_i \partial T} - + \frac{1}{T} \frac{\partial G^E}{\partial n_i} \right) +$$ + +You may notice that `yaeos` calculates the derivatives of the \(\ln \gamma \). +If for some reason you need the derivatives of the activity coefficients, you +may find useful the following expressions: + +$$ + \gamma_i = e^{\ln \gamma_i} +$$ + +$$ + \frac{\partial \gamma_i}{\partial n_j} = \frac{\partial \ln \gamma_i}{\partial n_j} e^{\ln \gamma_i} +$$ + +$$ + \frac{\partial \gamma_i}{\partial T} = + \frac{\partial \ln \gamma_i}{\partial T} e^{\ln \gamma_i} +$$ + + +#### Example + +```fortran +program main +use yaeos, only: pr +use yaeos, only: Groups, setup_unifac, UNIFAC + +type(UNIFAC) :: model + +integer, parameter :: nc = 3 + +type(Groups) :: molecules(nc) + +real(pr) :: n(nc), T, ln_gamma(nc), dln_gamma_dT(nc) +real(pr) :: dln_gamma_dn(nc, nc) + +T = 298.15_pr +n = [20.0_pr, 70.0_pr, 10.0_pr] + +! ! Ethane [CH3] +molecules(1)%groups_ids = [1] +molecules(1)%number_of_groups = [2] + +! ! Ethanol [CH3, CH2, OH] +molecules(2)%groups_ids = [1, 2, 14] +molecules(2)%number_of_groups = [1, 1, 1] + +! ! Methylamine [CH3-NH2] +molecules(3)%groups_ids = [28] +molecules(3)%number_of_groups = [1] + +! setup UNIFAC model +model = setup_unifac(molecules) + +! Calculate ln_gamma and its derivatives +call model%ln_gamma(n, T, ln_gamma, dln_gamma_dT, dln_gamma_dn) + +print *, "ln_gamma = ", ln_gamma +print *, "dln_gamma_dT = ", dln_gamma_dT +print *, "dln_gamma_dn = ", dln_gamma_dn +end program main +``` + +### Excess enthalpy \( (H^E) \) +From the Gibbs-Helmholtz equation [1]: + +$$ + \left(\frac{\partial \left(\frac{G^E}{T} \right)}{\partial T} + \right)_P = \frac{-H^E}{T^2} +$$ +We can calculate the excess enthalpy from the excess Gibbs energy as: + +$$ + H^E = G^E - T \frac{\partial G^E}{\partial T} +$$ + +The derivatives of the excess enthalpy can be calculated as: + +$$ +\frac{\partial H^E}{\partial T} = +-T \frac{\partial^2 G^E}{\partial T^2} +$$ + +$$ +\frac{\partial H^E}{\partial n_i} = \frac{\partial G^E}{\partial n_i} +- T \frac{\partial^2 G^E}{\partial T \partial n_i} +$$ + +#### Example +To simplify the example, we will use the same code as the previous example, +ommited here for brevity. The following code calculates the excess enthalpy and +its derivatives. + +```fortran +real(pr) :: H_E, dH_E_dT, dH_E_dn(nc) + +! Calculate excess enthalpy and its derivatives +call model%excess_enthalpy(n, T, HE, dHE_dT, dHE_dn) + +print *, "HE = ", HE +print *, "dHE_dT = ", dHE_dT +print *, "dHE_dn = ", dHE_dn +``` + + +### Excess entropy \( (S^E) \) +Finally, excess entropy can be calculated from the excess Gibbs energy and +excess enthalpy as: + +$$ +S^E = \frac{H^E - G^E}{T} +$$ + +Replacing \(H^E\): + +$$ +S^E= \frac{G^E - T \frac{\partial G^E}{\partial T} - G^E}{T} = +-\frac{\partial G^E}{\partial T} +$$ + +The derivatives of the excess entropy can be calculated as: + +$$ +\frac{\partial S^E}{\partial T} = -\frac{\partial^2 G^E}{\partial T^2} +$$ + +$$ +\frac{\partial S^E}{\partial n_i} = +-\frac{\partial^2 G^E}{\partial T \partial n_i} +$$ + +#### Example +To simplify the example, we will use the same code as the previous example, +ommited here for brevity. The following code calculates the excess entropy and +its derivatives. + +```fortran +real(pr) :: SE, dSE_dT, dSE_dn(nc) + +! Calculate excess entropy and its derivatives +call model%excess_entropy(n, T, SE, dSE_dT, dSE_dn) + +print *, "S_E = ", SE +print *, "dSE_dT = ", dSE_dT +print *, "dSE_dn = ", dSE_dn +``` + + +### References +[1] https://en.wikipedia.org/wiki/Gibbs%E2%80%93Helmholtz_equation \ No newline at end of file diff --git a/example/extra/taperobinson.f90 b/example/extra/taperobinson.f90 index 71e13d53a..d7c4ba4af 100644 --- a/example/extra/taperobinson.f90 +++ b/example/extra/taperobinson.f90 @@ -30,7 +30,7 @@ MODULE autodiff_tapenade_pr76_demo procedure :: ar_b procedure :: ar_d_b procedure :: ar_d_d - procedure :: v0 => VOLUME_INITALIZER + procedure :: get_v0 => VOLUME_INITALIZER end type TPR76 CONTAINS @@ -1352,15 +1352,15 @@ SUBROUTINE AR(model, n, v, t, arval) & arg11))*(r*t) end subroutine AR - PURE FUNCTION VOLUME_INITALIZER(model, n, p, t) RESULT (v0) + FUNCTION VOLUME_INITALIZER(self, n, p, t) RESULT (v0) IMPLICIT NONE - class(TPR76), INTENT(IN) :: model + class(TPR76), INTENT(IN) :: self REAL(pr), INTENT(IN) :: n(:) REAL(pr), INTENT(IN) :: p REAL(pr), INTENT(IN) :: t REAL(pr) :: v0 INTRINSIC SUM - v0 = SUM(n*model%b)/SUM(model%b) + v0 = SUM(n*self%b)/SUM(self%b) end function VOLUME_INITALIZER end module autodiff_tapenade_pr76_demo diff --git a/fpm.toml b/fpm.toml index 8c34e0846..6002f1815 100644 --- a/fpm.toml +++ b/fpm.toml @@ -17,7 +17,7 @@ library = true [fortran] implicit-typing = false -implicit-external = false +implicit-external = true source-form = "free" [dependencies] @@ -28,6 +28,7 @@ forsus = {git="https://github.com/ipqa-research/forsus"} fortime = { git = "https://github.com/gha3mi/fortime.git" } PowellOpt = { git = "https://github.com/jacobwilliams/PowellOpt/" } minpack = {git = "https://github.com/fortran-lang/minpack" } +finterp = { git = "https://github.com/jacobwilliams/finterp.git" } [dev-dependencies] test-drive = {git = "https://github.com/fortran-lang/test-drive"} diff --git a/python/docs/source/tutorial/cubic_eos.ipynb b/python/docs/source/tutorial/cubic_eos.ipynb index b77a23286..824d21636 100644 --- a/python/docs/source/tutorial/cubic_eos.ipynb +++ b/python/docs/source/tutorial/cubic_eos.ipynb @@ -181,9 +181,9 @@ "It is possible also to give some dependance of temperature to the $k_{ij}$\n", "values, corresponding to the equation:\n", "\n", - "\\begin{equation}\n", + "$$\n", " k_{ij}(T) = k_{ij}^{\\infty} + k_{ij}^{0} \\exp{\\left(-T/T^{ref}\\right)}\n", - "\\end{equation}" + "$$" ] }, { diff --git a/python/docs/source/tutorial/more_calculations.ipynb b/python/docs/source/tutorial/more_calculations.ipynb index 190f13ae5..22bd876c6 100644 --- a/python/docs/source/tutorial/more_calculations.ipynb +++ b/python/docs/source/tutorial/more_calculations.ipynb @@ -234,10 +234,10 @@ "text/plain": [ "{'x': array([0.02630095, 0.97369905]),\n", " 'y': array([0.5, 0.5]),\n", - " 'Vx': 0.08695218910075529,\n", - " 'Vy': 26.111737262933246,\n", + " 'Vx': 0.08695218910075517,\n", + " 'Vy': 26.111737262919863,\n", " 'T': 250.0,\n", - " 'P': 0.7816128221169543,\n", + " 'P': 0.7816128221173474,\n", " 'beta': 1.0}" ] }, @@ -608,21 +608,13 @@ "execution_count": 13, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1.0000000000000000 \n", - " 364.64999999999992 \n" - ] - }, { "data": { "text/plain": [ "{'x': [array([0.5, 0.5])],\n", - " 'Tc': 385.9303795748075,\n", - " 'Pc': 68.20063426935891,\n", - " 'Vc': 0.18481752004904956}" + " 'Tc': 385.9304105346266,\n", + " 'Pc': 68.20061554760588,\n", + " 'Vc': 0.18481779897181516}" ] }, "execution_count": 13, @@ -642,7 +634,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -678,7 +670,7 @@ }, { "data": { - "image/png": "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/z5aYwpza1hqiIiIqN5mDw2AQibgz8SriErNlTQLSw0RERHVm5+bAyaEtAIALJf4vjUsNURERNQgs+5rj/aeTnioZytIOVXXJC7pJiIiIvPVqoUDds8dBEEQJM3BIzVERETUYFIXGoClhoiIiCwESw0RERFZBJYaIiIisggsNURERGQRWGqIiIjIIrDUEBERkUVgqSEiIiKLwFJDREREFoGlhoiIiCwCSw0RERFZBJYaIiIisggsNURERGQRrGaV7htLoet0OomTEBERUW3d+N6+8T1+N1ZTagoKCgAAvr6+EichIiKiuiooKIBarb7rawSxNtXHAhgMBmRkZMDZ2fm25dF1Oh18fX2Rnp4OlUolUULzwLGqPY5V7XGsao9jVXscq9oz5bESRREFBQXw8fGBTHb3WTNWc6RGJpOhVatWd32NSqUyuf8zTRXHqvY4VrXHsao9jlXtcaxqz1TH6l5HaG7gRGEiIiKyCCw1REREZBFYagDY2trijTfegK2trdRRTB7HqvY4VrXHsao9jlXtcaxqz1LGymomChMREZFl45EaIiIisggsNURERGQRWGqIiIjIIrDUEBERkUWw2FKzatUqdOvWzXgjodDQUOzcudP4fGlpKWbNmgU3Nzc4OTkhIiICWq222j7S0tIwevRoODg4wNPTE6+88goqKyub+0dpcncbq9zcXMyePRsdOnSAvb09/Pz88MILLyA/P7/aPjhW1YmiiFGjRkEQBGzdurXacxyrfxw5cgRDhw6Fo6MjVCoVBg0ahJKSEuPzubm5mDx5MlQqFVxcXPDUU0+hsLCwuX+UJnevscrKysLjjz8OLy8vODo6olevXvjpp5+q7cNaxupW77zzDgRBwJw5c4zb+Ples1vHyiI/30ULtW3bNvGXX34RExMTxfPnz4uvvfaaaGNjI549e1YURVF89tlnRV9fX3Hv3r1iVFSU2K9fPzEsLMz4/srKSrFLly5ieHi4eOrUKfHXX38V3d3dxQULFkj1IzWZu41VbGysOH78eHHbtm1icnKyuHfvXjEgIECMiIgwvp9j9c9/VzcsW7ZMHDVqlAhA3LJli3E7x+qfsTp8+LCoUqnEyMhI8ezZs2JCQoK4ceNGsbS01LiPkSNHit27dxePHj0qHjx4UGzfvr04adIkqX6kJnOvsRo+fLjYu3dv8dixY+KFCxfEN998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u3YZi8edHuXl5Zg+fToyMzPRpUsX43sHDx6MadOmVdvfihUr4OjoiFWrVuHDDz9EZmZmc/9IRNQMFFIHICK61aBBg6oVjy5dumDmzJmYOXOmcduECRPg4OAALy8v4zZRFHHq1ClMmDABAFBcXIzp06dj//792L17N8LCwgAAarW6mX4SImpOLDVEZHLs7e1hb28PALhy5QquXbuGgQMHViswcrn8tvclJSWhoKAAvXr1QkpKCh566CE4ODggOjoa3t7ezZafiKTB009EZNJOnToFAOjVq9c9XxsdHQ25XA6tVouQkBD07dsXf/zxBwsNkZXgkRoiMmknT56Er68v3NzcavVaAHj44Yfx8ccfVztdRUSWj0dqiMiknTx5slZHaW68Njw8HN7e3oiOjm7iZERkalhqiMik1bXUjBo1Cj///DO+//57/Pe//23idERkSlhqiMhk5eTkID09vVal5uLFi8jLy0OvXr0QHByM9evXY8GCBfj555+bISkRmQLOqSEik3VjjkxtJwkLgoAePXoAAB555BHExcVh8uTJOHTokHE7EVkuHqkhIpN16tQpaDQa+Pj43PO1J0+eREBAAJydnY3blixZgpEjR2LcuHHIyspqyqhEZAIEURRFqUMQEdXVkCFD0KNHD6xYsaJe7xcEAVu2bMGDDz7YqLmISDo8UkNEZmvlypVwcnJCbGxsrd/z7LPPwsnJqQlTEZFUeKSGiMzSlStXUFJSAgDw8/ODUqms1fuys7Oh0+kAAN7e3nB0dGyyjETUvFhqiIiIyCLw9BMRERFZBJYaIiIisggsNURERGQRWGqIiIjIIrDUEBERkUVgqSEiIiKLwFJDREREFoGlhoiIiCwCSw0RERFZBJYaIiIisgj/H7T/eN/3pkUlAAAAAElFTkSuQmCC", + "image/png": "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", "text/plain": [ "
" ] @@ -741,8 +733,8 @@ "ids = [chemicals.CAS_from_any(name) for name in components]\n", "\n", "Tc = [chemicals.critical.Tc(id) for id in ids]\n", - "Pc = [chemicals.critical.Pc(id)/1e5 for id in ids]\n", - "w = [chemicals.acentric.omega(id) for id in ids]\n", + "Pc = [chemicals.critical.Pc(id) / 1e5 for id in ids]\n", + "w = [chemicals.acentric.omega(id) for id in ids]\n", "\n", "z = [0.3, 0.7]\n", "\n", @@ -802,12 +794,12 @@ "\n", "plt.plot(env[\"Ts\"], env[\"Ps\"], label=\"Envelope\")\n", "plt.scatter(T, Psat)\n", - "plt.scatter(T, Psat+5)\n", - "plt.scatter(T, Psat-5)\n", + "plt.scatter(T, Psat + 5)\n", + "plt.scatter(T, Psat - 5)\n", "plt.ylabel(\"P [bar]\")\n", "plt.xlabel(\"T [K]\")\n", "plt.show()\n", - "Psat\n" + "Psat" ] }, { @@ -838,7 +830,7 @@ "source": [ "ws = np.linspace(0, 1, 100)\n", "\n", - "Ps = [Psat+5, Psat, Psat-5]\n", + "Ps = [Psat + 5, Psat, Psat - 5]\n", "\n", "for P in Ps:\n", " tms = []\n", @@ -852,11 +844,13 @@ "plt.ylabel(\"tm\")\n", "plt.axhline(0, color=\"black\", linestyle=\"--\")\n", "plt.legend(title=\"Pressure [bar]\")\n", - "plt.title(\"\"\"\n", + "plt.title(\n", + " \"\"\"\n", " Comparison of tm values at different pressures. \n", " It is clear that above the saturation pressure the composition z is stable.\n", " But, below the saturation pressure the composition z is unstable and another phase appears.\n", - " \"\"\")\n", + " \"\"\"\n", + ")\n", "plt.show()" ] }, @@ -894,8 +888,8 @@ "ids = [chemicals.CAS_from_any(name) for name in components]\n", "\n", "Tc = [chemicals.critical.Tc(id) for id in ids]\n", - "Pc = [chemicals.critical.Pc(id)/1e5 for id in ids]\n", - "w = [chemicals.acentric.omega(id) for id in ids]\n", + "Pc = [chemicals.critical.Pc(id) / 1e5 for id in ids]\n", + "w = [chemicals.acentric.omega(id) for id in ids]\n", "\n", "z = [0.2, 0.2, 0.6]\n", "\n", @@ -926,7 +920,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAG2CAYAAADfpuRqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd5ycVb3/38/0vr33JJveQzoklCBRREBQvDYQ6/WHIKACFopcBQvFetFru8LFhogonUAChABJSO9lWzbb2+z08jy/P2ZndvrO9oQ979drXrvzPKc9Zyc5n/l+v+d7JEVRFAQCgUAgEAgmCNVkD0AgEAgEAsHUQogPgUAgEAgEE4oQHwKBQCAQCCYUIT4EAoFAIBBMKEJ8CAQCgUAgmFCE+BAIBAKBQDChCPEhEAgEAoFgQhHiQyAQCAQCwYQixIdAIBAIBIIJRYgPgUAgEAgEE8qki4/XXnuNyy67jNLSUiRJ4qmnnhqyzubNm1m6dCl6vZ4ZM2bwhz/8YdzHKRAIBALBe43JWoMnXXw4nU4WLVrEL37xi4zK19XVcemll3LBBRewe/duvvrVr/K5z32OF154YZxHKhAIBALBe4vJWoOlM+lgOUmS+Mc//sEVV1yRssxtt93GM888w/79+yPXPvaxj9Hb28vzzz8/AaMUCAQCgeC9x0SuwZrRDHQy2LZtGxs2bIi5dskll/DVr341ZR2v14vX6428l2WZ7u5u8vLykCRpvIYqEAgEgrMcRVHo7++ntLQUlWr8nAUejwefzzcmbSmKkrC26fV69Hr9qNseyRqcjLNOfLS2tlJUVBRzraioCLvdjtvtxmg0JtS57777uOeeeyZqiAKBQCB4j9HU1ER5efm4tO3xeKipstDaHhyT9iwWCw6HI+baXXfdxd133z3qtkeyBifjrBMfI+GOO+7glltuibzv6+ujsrKSpqYmbDbbJI5MIBAIBGcydrudiooKrFbruPXh8/lobQ9St7MKm3V01hV7v0zNsoaE9W0srB5jyVknPoqLi2lra4u51tbWhs1mS6m4Upmbgs4V2MpPj8s4BQKBQPDeYSJc9DaratTiI9KWzTYuX65HsgYnY9J3uwyX1atXs2nTpphrL730EqtXrx52Wz5Fpr25dKyGJhAIBALBiAkq8pi8xpOxWoMnXXw4HA52797N7t27gdA2nt27d9PY2AiEXCaf/vSnI+W/9KUvcfLkSb7xjW9w+PBhfvnLX/LXv/6Vm2++edh9+xQFj6LQfKpkTJ5FIBAIBIKRIqOMyWs4TNYaPOlulx07dnDBBRdE3odjM6699lr+8Ic/0NLSEpkEgJqaGp555hluvvlmfvKTn1BeXs5vfvMbLrnkkmH3fd65HZjNKsor1CxYYOaqK5/k/PPPP+N8YwKBQCB47yMjM1q7xXBbmKw1+IzK8zFR2O12srKykt7Lzs7mk5/8JHfffTd5eXkTPDKBQHAmoCgKgUCAYHBsdh8IzmzUajUajSZpXEd4vejr6xu3DQrhPk4fKR+TgNPSWafGdbxjwaRbPiaTP/49H4D6kwF27fDxxqseOtp7efzxx/nSl75EdnY2arV6kkcpEAgmEp/PR0tLCy6Xa7KHIphATCYTJSUl6HS6SRtDUFEIjtIeMNr6E8WUFh9VM/VYrCrmLYNLPwLBoMKONz30dMlIkiSEh0AwxZBlmbq6OtRqNaWlpeh0OpGI8D2Ooij4fD46Ojqoq6ujtrZ2XJOJpWMkMRvJ2jgbmNLiw48KX3TMrRrOOc8EgFu5hN2NsLiyaZJGJxAIJhqfz4csy1RUVGAymSZ7OIIJwmg0otVqaWhowOfzYTAYJntI73mmtvhQ1PiVWIXrB9QogBrVOG9ZEggEZyaT9c1XMHmcCX9zGYWgsHy89wmJj0TXSlAKiQ61IvFm/TRUksyqqvoJHp1AIBAIphLC7TJFePV5F11tATwuGbVGwpatpqhcS02tlpIqLVqVCj+gQub1+umcV31isocsEAgEAsFZz5QWHw/d1pLyntmqYt45Jpaea2b1RSbKK7UTODKBQCCYWlx33XX09vby1FNPTfZQJg2x22WKUD3bwLR5RkxWDQG/Ql93gLZGL6eOe3D2y7zzqoN3XnXwyL0wfZ6Bi64oYsMVVj5yzvHJHrpAIBAAQ585MprTTCVJ4h//+AdXXHHFiOoLhoc88BptG2cDU1p83P34LEzWxJiPgF+h8YibA2/ZeXeznUM7HJw44OHEAQ+/+2EHv3x/Fj/89sssX758EkYtEAjOeIJBeP11aGmBkhI47zwYp637LS2DFty//OUv3HnnnRw5ciRyzWKxjEu/AsFomPzw3kkkiBQJOo1+KRoNFfOsfOBzJXz7sVn8eusCPnt3BdMXGAn4FTY/bWfFihVcdNFFvPbaa5P9GAKB4EziySehuhouuAA+/vHQz+rq0PVxoLi4OPLKyspCkqSYa3/+85+ZM2cOBoOB2bNn88tf/jJS1+fzccMNN1BSUoLBYKCqqor77rsPgOrqagCuvPJKJEmKvI+nvr4eSZL485//zJo1azAYDMyfP58tW7ZEygSDQT772c9SU1OD0Whk1qxZ/OQnP0na3o9//GNKSkrIy8vj//2//4ff74/c++Uvf0ltbS0Gg4GioiKuvvrqyD1ZlrnvvvsifSxatIgnnnhipNM6KQQHdruM9nU2MKUtHwHUBFERVBLNlmpJITiwDdeYq+LCjxez4ROFnNzv5IX/bWfrv7t55ZVXeOWVV7j99tsj/2AFAsEU5skn4eqrId7v3twcuv7EE/DhD0/YcP7v//6PO++8k5///OcsWbKEXbt28fnPfx6z2cy1117LT3/6U55++mn++te/UllZSVNTE01NodxG27dvp7CwkN///vds3LhxyKSLX//613n44YeZO3cuDz74IJdddhl1dXXk5eUhyzLl5eX87W9/Iy8vjzfffJMvfOELlJSU8NGPfjTSxquvvkpJSQmvvvoqx48f55prrmHx4sV8/vOfZ8eOHdx44408+uijrFmzhu7ubl5//fVI3fvuu4/HHnuMRx55hNraWl577TU++clPUlBQwPr168dngseYoBJ6jbaNs4EpLT78ihrNwFbbYFS+D7UkI0f9AYOExIkaFRXzsvjiD6185OYynn6khVef6OJDH/rQhI5bIBCcgQSDcNNNicIDQtckCb76Vbj88nFzwcRz11138cADD/DhAcFTU1PDwYMH+dWvfsW1115LY2MjtbW1nHvuuUiSRFVVVaRuQUEBEDrvqri4eMi+brjhBq666ioA/vu//5vnn3+e3/72t3zjG99Aq9Vyzz33RMrW1NSwbds2/vrXv8aIj5ycHH7+85+jVquZPXs2l156KZs2beLzn/88jY2NmM1mPvjBD2K1WqmqqmLJkiUAeL1evv/97/Pyyy9HjnafNm0ab7zxBr/61a/OGvEhYj6mCEFFhU9JnIIYIYJMcMA7FT4tMIhEVomJT90znStuKKeh4CusZsfEDFogEJyZvP46nDqV+r6iQFNTqNz554/7cJxOJydOnOCzn/0sn//85yPXA4FA5GDN6667josvvphZs2axceNGPvjBD/K+971v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i6mqqmLatGls3LiRjRs3cuWVV2IymTh+/Dgul4uLL744pj+fz8eSJUsynMXJQR6D9Ohny26XKS0+ZEWCIHTtaaF580k6d57C0dCTeQMSGIttWKtzsM3IJ3tmAbnzCjAWWCLbaCM/UwgRlSSDXkftVXOpvXwWJ587zp7f76W/2cEbD+6m4NE8lnxqNv/6zitiW5pAcAbT0jK25UbKunXruOSSS7jjjju47rrrYu45HA6++MUvcuONNybUq6ysBOD888/n17/+Na+//jpLlizBZrNFBMmWLVtYv379mIxTqx2MbwvvyJHlUBD/1772NV566SV+/OMfM2PGDIxGI1dffXXkUE6r1cq7777L5s2befHFF7nzzju5++672b59Ow6HA4BnnnmGsrKymD71ev2YjF0weqa0+GjeXMex/9uNozFWcOhyTZiKbehyjKiNOiS1hBJUCHr8+Ps9+HpceNodBD0B3C123C122rc1ROobi6zkLiohf2k5ReeUYSyypBYiEZECKrXEtMtmMe39Mzj57HF2/3YPjlYnbzy4i4L/LuDLn/8yt956a+Q/CYFAcOYw8OV9zMqNhvvvv5/Fixcza9asmOtLly7l4MGDzJgxI2Xd9evX89WvfpW//e1vkdiO888/n5dffpmtW7dy6623Dtn/W2+9FYnBCAQC7Ny5MxJXkglbt27luuuu48orrwRCoqm+vj6mjEajYcOGDWzYsIG77rqL7OxsXnnlFS6++GL0ej2NjY1jJpQmirFJMiYsH2c8u+57FQC1SUvJ+bXkr64hZ0EJumzTkIf7KIqCr8eFu6kbR10X9uOd2A+30V/Xhbutn+YX+2l+8SgA1ppcCldVUXxuDXnzClBrpFghghJrDVFLTPvQLGo2TufEs8c59NdD9Jzo5ac//Sm//OUv+da3vsXdd9893tMjEAiGwXnnhWI6mptDLpZ4wjEf5503/mNZsGABn/jEJ/jpT38ac/22225j1apV3HDDDXzuc5/DbDZz8OBBXnrpJX7+858DIXdITk4Ojz/+OP/+d+j4h/PPP5+vfe1rSJLE2rVrh+z/F7/4BbW1tcyZM4eHHnqInp6emIDSoaitreXJJ5/ksssuQ5IkvvOd70SsIgD//ve/OXnyJOvWrSMnJ4dnn30WWZaZNWsWVquVr33ta9x8883Issy5555LX18fW7duxWazce21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EMePHxef/OQny5q3fC3IaN+9613vEg888IA4cOCAOHHihPiDP/gDUVNTI7q7u+e45fMvo32X1oULF0RHR4e49dZbxRve8Ia5aewClNH+i0QiYseOHeI1r3mN2Lt3r7hw4YJ48sknxcGDB+e45fMvo3333e9+VzgcDvHd735XXLhwQfz6178WbW1t4i/+4i/muOXzr4cfflh84hOfED/+8Y8FULDJWr7Onz8v3G63uO+++8Tx48fFl770JWGxWMQjjzwyNw2+RnRNwseuXbvEhz/84cznRCIh2tvbxWc/+1nV9G9/+9vFa1/72pxju3fvFn/8x388q+1ciDLad/mKx+PC5/OJ//iP/5itJi5YldN38Xhc3HTTTeLf/u3fxPve975FDR9G++8rX/mKWLFihYhGo3PVxAUro3334Q9/WNx55505x+677z5x8803z2o7F7r0wMdf/dVfiY0bN+Yce8c73iHuvvvuWWzZtadrzu0SjUbZv38/e/bsyRyTZZk9e/bw3HPPqeZ57rnnctID3H333Zrpr1WV03f5CgaDxGKxWd0BciGq3L7727/9W5qbm/nABz4wF81csCqn/372s59x44038uEPf5iWlhY2bdrE3//935NIJOaq2QtC5fTdTTfdxP79+zOumfPnz/Pwww/zmte8Zk7afDXLHC+qo2tuV9v53CL4alc5fZevj3zkI7S3txf8cV7rKqfv9u7dy9e//nUOHjw4By1c2Cqn/86fP88TTzzBu9/9bh5++GHOnj3Ln/7pnxKLxbj//vvnotkLQuX03bve9S6Gh4e55ZZbEEIQj8f5kz/5Ez7+8Y/PRZOvammNF5OTk4RCIVwu1zy17OrSNWf5MDV/+tznPseDDz7IQw89tKi2hi5HU1NTvOc97+FrX/sajY2N892cq1KKotDc3My//uu/sn37dt7xjnfwiU98gq9+9avz3bQFryeffJK///u/58tf/jIvv/wyP/7xj/nlL3/Jpz/96flumqlFomvO8jGfWwRf7Sqn79L6whe+wOc+9zkee+wxtmzZMpvNXJAy2nfnzp3j4sWL3HvvvZljiqIAYLVaOXXqFCtXrpzdRi8glXPvtbW1YbPZsFgsmWPr16+nv7+faDSK3W6f1TYvFJXTd3/913/Ne97zHj74wQ8CsHnzZgKBAH/0R3/EJz7xCWTZ/F2qJa3xwu/3m1YPA7rm7rB53SL4Klc5fQfwD//wD3z605/mkUceYceOHXPR1AUno323bt06jhw5wsGDBzOv17/+9bziFa/g4MGDdHZ2zmXz513l3Hs333wzZ8+ezUAbwOnTp2lra1s04AHl9V0wGCwAjDTECXO7r6Iyx4sqab4jXmdD87VF8LUgo333uc99TtjtdvHDH/5Q9PX1ZV5TU1Pz9RXmTUb7Ll+LfbaL0f67fPmy8Pl84s/+7M/EqVOnxC9+8QvR3NwsPvOZz8zXV5g3Ge27+++/X/h8PvGf//mf4vz58+LRRx8VK1euFG9/+9vn6yvMm6ampsSBAwfEgQMHBCD+6Z/+SRw4cEBcunRJCCHERz/6UfGe97wnkz491fZ//s//KU6cOCEeeOABc6ptGbom4UOI+dki+FqRkb5bunSpAApe999//9w3fAHI6H2XrcUOH0IY779nn31W7N69WzgcDrFixQrxd3/3dyIej89xqxeGjPRdLBYT/+t//S+xcuVK4XQ6RWdnp/jTP/1TMTY2NvcNn2f99re/VX2Gpfvrfe97n7j99tsL8mzbtk3Y7XaxYsUK8e///u9z3u6rXZIQpo3NlClTpkyZMjV3uuZiPkyZMmXKlClTC1smfJgyZcqUKVOm5lQmfJgyZcqUKVOm5lQmfJgyZcqUKVOm5lQmfJgyZcqUKVOm5lQmfJgyZcqUKVOm5lQmfJgyZcqUKVOm5lQmfJgyZcqUKVOm5lQmfJgyZcqUKVOm5lQmfJgytUj193//90iSVPD64he/ON9NM2XK1DUuc3l1U6YWqaampggEApnPn/rUp3j00UfZu3cvS5YsmceWmTJl6lqXafkwZWqRyufz0draSmtrKw888ACPPvooTz75JEuWLOFNb3oTdXV1vPWtb53vZpoyZeoalAkfpkwtcn3qU5/i29/+Nk8++STLli0D4H/8j//Bt771rfltmClTpq5ZmfBhytQi1v3338+3vvWtHPAAuOOOO/D5fPPXMFOmTF3TMuHDlKlFqvvvv5//+I//KAAPU6ZMmZptWee7AaZMmZp7feYzn+ErX/kKP/vZz3A6nfT39wNQV1eHw+GY59aZMmXqWpcJH6ZMLTIJIfjHf/xHJicnufHGG3PO7du3j507d85Ty0yZMrVYZMKHKVOLTJIkMTExMd/NMGXK1CKWuc6HKVOmCrRnzx4OHTpEIBCgvr6eH/zgBwVWElOmTJkqVyZ8mDJlypQpU6bmVOZsF1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnMqED1OmTJkyZcrUnOr/B7Ug139DHOe5AAAAAElFTkSuQmCC", + "image/png": "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", "text/plain": [ "
" ] @@ -949,23 +943,26 @@ "for j, w1 in enumerate(w1s):\n", " for i, w2 in enumerate(w2s):\n", " w = [w1, w2, 1 - w1 - w2]\n", - " \n", + "\n", " if w[-1] <= 0:\n", " continue\n", - " \n", + "\n", " tm = model.stability_tm(z=z, w=w, pressure=P, temperature=T)\n", - " if tm < minval: \n", + " if tm < minval:\n", " w_min = w\n", " minval = tm\n", " tms[i, j] = tm\n", "\n", "plt.imshow(tms, extent=(0, 1, 0, 1), origin=\"lower\", aspect=\"auto\")\n", "plt.contour(\n", - " tms, extent=(0, 1, 0, 1), \n", - " levels=[i/10 for i in range(-25, 25)], \n", - " origin=\"lower\",colors=\"black\")\n", + " tms,\n", + " extent=(0, 1, 0, 1),\n", + " levels=[i / 10 for i in range(-25, 25)],\n", + " origin=\"lower\",\n", + " colors=\"black\",\n", + ")\n", "\n", - "plt.scatter(z[0], z[1], color=\"red\", label=\"Test pahse\")\n", + "plt.scatter(z[0], z[1], color=\"red\", label=\"Test phase\")\n", "plt.scatter(w_min[0], w_min[1], color=\"blue\", label=\"New phase\")\n", "plt.colorbar()\n", "plt.legend()\n", @@ -992,11 +989,7 @@ { "data": { "text/plain": [ - "{'w_min': array([0.65460666, 0.13648048, 0.20891286]),\n", - " 'tm_min': -0.15793334532739212,\n", - " 'all_mins_w': array([[0.65460666, 0.13648048, 0.20891286],\n", - " [0.20000002, 0.2 , 0.59999998],\n", - " [0.19999997, 0.2 , 0.60000003]])}" + "{'w': array([0.65460666, 0.13648048, 0.20891286]), 'tm': -0.15793334532739212}" ] }, "execution_count": 21, @@ -1005,22 +998,25 @@ } ], "source": [ - "stab_analysis = model.stability_analysis(z, pressure=P, temperature=T)\n", - "stab_analysis" + "minima, all_found_nimimas = model.stability_analysis(\n", + " z, pressure=P, temperature=T\n", + ")\n", + "minima" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The `stability_analysis` method returns a dictionary with three different keys:\n", - "\n", - "- `w_min`: The trial phase composition at the minimimum found value of `tm`\n", - "- `tm_min`: The miniumum value of `tm`\n", - "- `all_mins_w`: All the trial phase composition that give a local minima. \n", - "It will have each composition as a row, corresponding to each minimization\n", - "intent. It is possible to see that in this case there is only one minima\n", - "found different than that of the test phase." + "The `stability_analysis` method returns a a tuple of dictionaries with two keys:\n", + "\n", + "- `w`: The trial phase composition at the minimimum found value of `tm`\n", + "- `tm`: The miniumum value of `tm`\n", + "\n", + "The first output of the tuple corresponds to the lower minima found, and the\n", + "second one will a found minima for each initialization. Each initialization\n", + "begins when starting from a pure component, so it will have the length of \n", + "number of components." ] }, { @@ -1041,10 +1037,368 @@ } ], "source": [ - "# Comparing the found w_min with the one obtained before by sweeping \n", + "# Comparing the found w_min with the one obtained before by sweeping\n", "# the composition space\n", - "stab_analysis[\"w_min\"], w_min" + "minima[\"w\"], w_min" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'w': array([0.65460666, 0.13648048, 0.20891286]), 'tm': -0.15793334532739212}" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "minima" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tm': array([1.04563762, 1.17188022, 1.17188022]),\n", + " 'w': array([[0.65460666, 0.13648048, 0.20891286],\n", + " [0.20000002, 0.2 , 0.59999998],\n", + " [0.19999997, 0.2 , 0.60000003]])}" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_found_nimimas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pure components saturation lines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['METHANE' 'ETHANE' 'PROPANE' ... '2-HYDROXYPROPYL METHACRYLATE'\n", + " 'ETHYL-3-ETHOXYPROPIONATE' 'BIS-(2-HYDROXYETHYL) TEREPHTHALATE']\n" + ] + }, + { + "ename": "ValueError", + "evalue": "Chemical name (n-HEPTANE) not recognized", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[11], line 12\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28mprint\u001b[39m(dp\u001b[38;5;241m.\u001b[39mconstants\u001b[38;5;241m.\u001b[39mall_compounds)\n\u001b[1;32m 10\u001b[0m components \u001b[38;5;241m=\u001b[39m dp\u001b[38;5;241m.\u001b[39mconstants\u001b[38;5;241m.\u001b[39mall_compounds\n\u001b[0;32m---> 12\u001b[0m ids \u001b[38;5;241m=\u001b[39m [\u001b[43mchemicals\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mCAS_from_any\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m components]\n\u001b[1;32m 14\u001b[0m Tcs \u001b[38;5;241m=\u001b[39m [chemicals\u001b[38;5;241m.\u001b[39mcritical\u001b[38;5;241m.\u001b[39mTc(\u001b[38;5;28mid\u001b[39m) \u001b[38;5;28;01mfor\u001b[39;00m \u001b[38;5;28mid\u001b[39m \u001b[38;5;129;01min\u001b[39;00m ids]\n\u001b[1;32m 15\u001b[0m Pcs \u001b[38;5;241m=\u001b[39m [chemicals\u001b[38;5;241m.\u001b[39mcritical\u001b[38;5;241m.\u001b[39mPc(\u001b[38;5;28mid\u001b[39m) \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m1e5\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m \u001b[38;5;28mid\u001b[39m \u001b[38;5;129;01min\u001b[39;00m ids]\n", + "File \u001b[0;32m~/docs/programming/python/virtualenvs/thermo/lib/python3.12/site-packages/chemicals/identifiers.py:511\u001b[0m, in \u001b[0;36mCAS_from_any\u001b[0;34m(ID, autoload, cache)\u001b[0m\n\u001b[1;32m 469\u001b[0m \u001b[38;5;129m@mark_numba_incompatible\u001b[39m\n\u001b[1;32m 470\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mCAS_from_any\u001b[39m(ID, autoload\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m, cache\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[1;32m 471\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Wrapper around `search_chemical` which returns the CAS number of the\u001b[39;00m\n\u001b[1;32m 472\u001b[0m \u001b[38;5;124;03m found chemical directly.\u001b[39;00m\n\u001b[1;32m 473\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 509\u001b[0m \u001b[38;5;124;03m '17778-80-2'\u001b[39;00m\n\u001b[1;32m 510\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 511\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msearch_chemical\u001b[49m\u001b[43m(\u001b[49m\u001b[43mID\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mautoload\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mautoload\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mCASs\n", + "File \u001b[0;32m~/docs/programming/python/virtualenvs/thermo/lib/python3.12/site-packages/chemicals/identifiers.py:616\u001b[0m, in \u001b[0;36msearch_chemical\u001b[0;34m(ID, autoload, cache)\u001b[0m\n\u001b[1;32m 614\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m chemical_search_cache[ID]\n\u001b[1;32m 615\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m _pubchem_db_loaded: get_pubchem_db() \u001b[38;5;66;03m# pragma: no cover\u001b[39;00m\n\u001b[0;32m--> 616\u001b[0m hit \u001b[38;5;241m=\u001b[39m \u001b[43m_search_chemical\u001b[49m\u001b[43m(\u001b[49m\u001b[43mID\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mautoload\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 617\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m cache:\n\u001b[1;32m 618\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(chemical_search_cache) \u001b[38;5;241m>\u001b[39m chemical_search_cache_max_size:\n\u001b[1;32m 619\u001b[0m \u001b[38;5;66;03m# invalidate cache by time - first entry is removed relying on\u001b[39;00m\n\u001b[1;32m 620\u001b[0m \u001b[38;5;66;03m# dict ordering new in Python 3.7\u001b[39;00m\n", + "File \u001b[0;32m~/docs/programming/python/virtualenvs/thermo/lib/python3.12/site-packages/chemicals/identifiers.py:742\u001b[0m, in \u001b[0;36m_search_chemical\u001b[0;34m(ID, autoload)\u001b[0m\n\u001b[1;32m 739\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m 741\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m autoload:\n\u001b[0;32m--> 742\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_search_chemical\u001b[49m\u001b[43m(\u001b[49m\u001b[43mID\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mautoload\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 744\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mChemical name (\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m) not recognized\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m(ID))\n", + "File \u001b[0;32m~/docs/programming/python/virtualenvs/thermo/lib/python3.12/site-packages/chemicals/identifiers.py:744\u001b[0m, in \u001b[0;36m_search_chemical\u001b[0;34m(ID, autoload)\u001b[0m\n\u001b[1;32m 741\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m autoload:\n\u001b[1;32m 742\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _search_chemical(ID, autoload\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m--> 744\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mChemical name (\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m) not recognized\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m(ID))\n", + "\u001b[0;31mValueError\u001b[0m: Chemical name (n-HEPTANE) not recognized" + ] + } + ], + "source": [ + "import yaeos\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import chemicals\n", + "\n", + "components = [\"methane\", \"propane\"]\n", + "\n", + "ids = [chemicals.CAS_from_any(name) for name in components]\n", + "\n", + "Tcs = [chemicals.critical.Tc(id) for id in ids]\n", + "Pcs = [chemicals.critical.Pc(id) / 1e5 for id in ids]\n", + "ws = [chemicals.acentric.omega(id) for id in ids]\n", + "\n", + "model = yaeos.PengRobinson78(Tcs, Pcs, ws)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.0, 50.992)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for i, (Tc, Pc) in enumerate(zip(Tcs, Pcs)):\n", + " P, T, Vx, Vy = yaeos.yaeos_c.pure_saturation_line(model.id, i + 1, 1, 100)\n", + " plt.scatter(Tc, Pc)\n", + " plt.plot(T, P)\n", + "\n", + "plt.xlim(0, max(Tcs) + 5)\n", + "plt.ylim(0, max(Pcs) + 5)" ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 99.9900101 , 100.00565242, 100.02129998, 100.03695279,\n", + " 100.05261086, 100.06827419, 100.08394278, 100.09961662,\n", + " 100.11529574, 100.13098012, 100.14666977, 100.16236469,\n", + " 100.17806489, 100.19377037, 100.20948112, 100.22519717,\n", + " 100.24091849, 100.25664511, 100.27237701, 100.28811421,\n", + " 100.30385671, 100.31960451, 100.33535761, 100.35111601,\n", + " 100.36687972, 100.38264874, 100.39842307, 100.41420271,\n", + " 100.42998768, 100.44577796, 100.46157357, 100.4773745 ,\n", + " 100.49318076, 100.50899235, 100.52480928, 100.54063154,\n", + " 100.55645914, 100.57229209, 100.58813037, 100.60397401,\n", + " 100.61982299, 100.63567733, 100.65153702, 100.66740207,\n", + " 100.68327248, 100.69914825, 100.71502938, 100.73091589,\n", + " 100.74680777, 100.76270502, 100.77860765, 100.79451565,\n", + " 100.81042904, 100.82634781, 100.84227197, 100.85820153,\n", + " 100.87413647, 100.89007681, 100.90602254, 100.92197368,\n", + " 100.93793022, 100.95389217, 100.96985952, 100.98583229,\n", + " 101.00181047, 101.01779407, 101.03378309, 101.04977753,\n", + " 101.06577739, 101.08178269, 101.09779341, 101.11380957,\n", + " 101.12983116, 101.1458582 , 101.16189067, 101.17792859,\n", + " 101.19397196, 101.21002077, 101.22607504, 101.24213476,\n", + " 101.25819994, 101.27427058, 101.29034669, 101.30642826,\n", + " 101.3225153 , 101.33860781, 101.3547058 , 101.37080926,\n", + " 101.38691821, 101.40303263, 101.41915254, 101.43527794,\n", + " 101.45140883, 101.46754522, 101.4836871 , 101.49983448,\n", + " 101.51598736, 101.53214575, 101.54830964, 101.56447905,\n", + " 101.58065397, 101.5968344 , 101.61302035, 101.62921183,\n", + " 101.64540883, 101.66161135, 101.67781941, 101.69403299,\n", + " 101.71025212, 101.72647678, 101.74270698, 101.75894273,\n", + " 101.77518402, 101.79143086, 101.80768325, 101.8239412 ,\n", + " 101.84020471, 101.85647378, 101.87274841, 101.8890286 ,\n", + " 101.90531437, 101.92160571, 101.93790262, 101.95420511,\n", + " 101.97051318, 101.98682683, 102.00314607, 102.0194709 ,\n", + " 102.03580132, 102.05213733, 102.06847894, 102.08482615,\n", + " 102.10117896, 102.11753738, 102.13390141, 102.15027105,\n", + " 102.1666463 , 102.18302717, 102.19941366, 102.21580577,\n", + " 102.23220351, 102.24860687, 102.26501587, 102.2814305 ,\n", + " 102.29785077, 102.31427667, 102.33070822, 102.34714542,\n", + " 102.36358826, 102.38003676, 102.39649091, 102.41295071,\n", + " 102.42941618, 102.44588731, 102.4623641 , 102.47884656,\n", + " 102.4953347 , 102.5118285 , 102.52832799, 102.54483315,\n", + " 102.561344 , 102.57786053, 102.59438275, 102.61091066,\n", + " 102.62744427, 102.64398357, 102.66052858, 102.67707929,\n", + " 102.6936357 , 102.71019782, 102.72676565, 102.7433392 ,\n", + " 102.75991846, 102.77650345, 102.79309416, 102.80969059,\n", + " 102.82629276, 102.84290065, 102.85951428, 102.87613365,\n", + " 102.89275876, 102.90938961, 102.92602621, 102.94266856,\n", + " 102.95931666, 102.97597051, 102.99263013, 103.0092955 ,\n", + " 103.02596664, 103.04264355, 103.05932622, 103.07601467,\n", + " 103.0927089 , 103.1094089 , 103.12611468, 103.14282625,\n", + " 103.15954361, 103.17626676, 103.1929957 , 103.20973044,\n", + " 103.22647097, 103.24321731, 103.25996946, 103.27672741,\n", + " 103.29349117, 103.31026075, 103.32703614, 103.34381736,\n", + " 103.3606044 , 103.37739726, 103.39419595, 103.41100048,\n", + " 103.42781084, 103.44462703, 103.46144907, 103.47827695,\n", + " 103.49511068, 103.51195026, 103.52879569, 103.54564698,\n", + " 103.56250412, 103.57936713, 103.596236 , 103.61311074,\n", + " 103.62999135, 103.64687784, 103.6637702 , 103.68066844,\n", + " 103.69757256, 103.71448257, 103.73139847, 103.74832025,\n", + " 103.76524794, 103.78218152, 103.799121 , 103.81606639,\n", + " 103.83301768, 103.84997488, 103.866938 , 103.88390703,\n", + " 103.90088198, 103.91786285, 103.93484965, 103.95184237,\n", + " 103.96884103, 103.98584562, 104.00285614, 104.01987261,\n", + " 104.03689502, 104.05392337, 104.07095768, 104.08799793,\n", + " 104.10504415, 104.12209632, 104.13915445, 104.15621855,\n", + " 104.17328861, 104.19036464, 104.20744665, 104.22453464,\n", + " 104.2416286 , 104.25872855, 104.27583448, 104.2929464 ,\n", + " 104.31006432, 104.32718823, 104.34431813, 104.36145404,\n", + " 104.37859595, 104.39574387, 104.4128978 , 104.43005775,\n", + " 104.44722371, 104.46439569, 104.48157369, 104.49875772,\n", + " 104.51594777, 104.53314386, 104.55034599, 104.56755415,\n", + " 104.58476836, 104.6019886 , 104.6192149 , 104.63644725,\n", + " 104.65368565, 104.6709301 , 104.68818062, 104.7054372 ,\n", + " 104.72269985, 104.73996856, 104.75724335, 104.77452422,\n", + " 104.79181116, 104.80910418, 104.82640329, 104.84370849,\n", + " 104.86101978, 104.87833716, 104.89566064, 104.91299022,\n", + " 104.93032591, 104.9476677 , 104.9650156 , 104.98236961,\n", + " 104.99972975, 105.017096 , 105.03446837, 105.05184687,\n", + " 105.06923149, 105.08662225, 105.10401915, 105.12142218,\n", + " 105.13883136, 105.15624668, 105.17366814, 105.19109576,\n", + " 105.20852953, 105.22596946, 105.24341555, 105.26086781,\n", + " 105.27832623, 105.29579082, 105.31326158, 105.33073852,\n", + " 105.34822164, 105.36571095, 105.38320643, 105.40070811,\n", + " 105.41821598, 105.43573005, 105.45325031, 105.47077678,\n", + " 105.48830945, 105.50584833, 105.52339342, 105.54094473,\n", + " 105.55850226, 105.576066 , 105.59363597, 105.61121217,\n", + " 105.6287946 , 105.64638326, 105.66397816, 105.6815793 ,\n", + " 105.69918669, 105.71680032, 105.7344202 , 105.75204633,\n", + " 105.76967872, 105.78731737, 105.80496229, 105.82261347,\n", + " 105.84027092, 105.85793464, 105.87560464, 105.89328092,\n", + " 105.91096348, 105.92865233, 105.94634746, 105.96404889,\n", + " 105.98175662, 105.99947064, 106.01719096, 106.03491759,\n", + " 106.05265053, 106.07038978, 106.08813535, 106.10588723,\n", + " 106.12364544, 106.14140997, 106.15918083, 106.17695802,\n", + " 106.19474155, 106.21253141, 106.23032761, 106.24813016,\n", + " 106.26593906, 106.28375431, 106.30157591, 106.31940387,\n", + " 106.3372382 , 106.35507888, 106.37292594, 106.39077936,\n", + " 106.40863916, 106.42650534, 106.4443779 , 106.46225684,\n", + " 106.48014217, 106.49803389, 106.51593201, 106.53383652,\n", + " 106.55174744, 106.56966475, 106.58758848, 106.60551862,\n", + " 106.62345517, 106.64139814, 106.65934752, 106.67730334,\n", + " 106.69526558, 106.71323425, 106.73120935, 106.7491909 ,\n", + " 106.76717888, 106.78517331, 106.80317419, 106.82118151,\n", + " 106.83919529, 106.85721553, 106.87524223, 106.8932754 ,\n", + " 106.91131503, 106.92936113, 106.94741371, 106.96547276,\n", + " 106.9835383 , 107.00161032, 107.01968883, 107.03777383,\n", + " 107.05586532, 107.07396332, 107.09206781, 107.11017881,\n", + " 107.12829632, 107.14642033, 107.16455087, 107.18268792,\n", + " 107.2008315 , 107.21898159, 107.23713822, 107.25530138,\n", + " 107.27347108, 107.29164731, 107.30983009, 107.32801941,\n", + " 107.34621528, 107.36441771, 107.38262668, 107.40084222,\n", + " 107.41906433, 107.43729299, 107.45552823, 107.47377004,\n", + " 107.49201843, 107.51027339, 107.52853494, 107.54680308,\n", + " 107.56507781, 107.58335913, 107.60164704, 107.61994156,\n", + " 107.63824268, 107.65655041, 107.67486475, 107.69318571,\n", + " 107.71151328, 107.72984747, 107.74818829, 107.76653574,\n", + " 107.78488982, 107.80325053, 107.82161788, 107.83999187,\n", + " 107.85837251, 107.8767598 , 107.89515374, 107.91355434,\n", + " 107.93196159, 107.95037551, 107.9687961 , 107.98722335,\n", + " 108.00565728, 108.02409788, 108.04254517, 108.06099914,\n", + " 108.07945979, 108.09792714, 108.11640118, 108.13488192,\n", + " 108.15336936, 108.17186351, 108.19036436, 108.20887193,\n", + " 108.22738621, 108.24590721, 108.26443493, 108.28296938,\n", + " 108.30151056, 108.32005847, 108.33861312, 108.3571745 ,\n", + " 108.37574264, 108.39431751, 108.41289914, 108.43148753,\n", + " 108.45008267, 108.46868457, 108.48729324, 108.50590867,\n", + " 108.52453088, 108.54315986, 108.56179562, 108.58043817,\n", + " 108.5990875 , 108.61774362, 108.63640653, 108.65507624,\n", + " 108.67375276, 108.69243607, 108.71112619, 108.72982313,\n", + " 108.74852688, 108.76723744, 108.78595483, 108.80467905,\n", + " 108.82341009, 108.84214796, 108.86089268, 108.87964423,\n", + " 108.89840262, 108.91716787, 108.93593996, 108.95471891,\n", + " 108.97350471, 108.99229738, 109.01109691, 109.02990331,\n", + " 109.04871658, 109.06753673, 109.08636376, 109.10519767,\n", + " 109.12403847, 109.14288616, 109.16174074, 109.18060222,\n", + " 109.1994706 , 109.21834589, 109.23722808, 109.25611719,\n", + " 109.27501321, 109.29391615, 109.31282602, 109.33174281,\n", + " 109.35066653, 109.36959719, 109.38853478, 109.40747932,\n", + " 109.4264308 , 109.44538923, 109.46435461, 109.48332694,\n", + " 109.50230624, 109.5212925 , 109.54028573, 109.55928593,\n", + " 109.5782931 , 109.59730725, 109.61632838, 109.6353565 ,\n", + " 109.6543916 , 109.6734337 , 109.6924828 , 109.7115389 ,\n", + " 109.730602 , 109.7496721 , 109.76874922, 109.78783335,\n", + " 109.80692451, 109.82602268, 109.84512788, 109.86424011,\n", + " 109.88335938, 109.90248568, 109.92161902, 109.9407594 ,\n", + " 109.95990684, 109.97906133, 109.99822287, 110.01739147,\n", + " 110.03656714, 110.05574987, 110.07493967, 110.09413655,\n", + " 110.11334051, 110.13255155, 110.15176967, 110.17099488,\n", + " 110.19022719, 110.20946659, 110.2287131 , 110.2479667 ,\n", + " 110.26722742, 110.28649525, 110.30577019, 110.32505226,\n", + " 110.34434145, 110.36363776, 110.38294121, 110.40225178,\n", + " 110.4215695 , 110.44089436, 110.46022637, 110.47956553,\n", + " 110.49891184, 110.5182653 , 110.53762593, 110.55699372,\n", + " 110.57636868, 110.59575082, 110.61514013, 110.63453662,\n", + " 110.65394029, 110.67335116, 110.69276921, 110.71219446,\n", + " 110.73162691, 110.75106656, 110.77051341, 110.78996748,\n", + " 110.80942877, 110.82889727, 110.84837299, 110.86785594,\n", + " 110.88734612, 110.90684353, 110.92634818, 110.94586007,\n", + " 110.96537921, 110.98490559, 111.00443923, 111.02398013,\n", + " 111.04352828, 111.0630837 , 111.08264639, 111.10221635,\n", + " 111.12179359, 111.1413781 , 111.1609699 , 111.18056899,\n", + " 111.20017537, 111.21978904, 111.23941001, 111.25903829,\n", + " 111.27867387, 111.29831677, 111.31796697, 111.3376245 ,\n", + " 111.35728935, 111.37696153, 111.39664103, 111.41632787,\n", + " 111.43602205, 111.45572357, 111.47543244, 111.49514865,\n", + " 111.51487222, 111.53460315, 111.55434144, 111.5740871 ,\n", + " 111.59384012, 111.61360052, 111.63336829, 111.65314345,\n", + " 111.67292599, 111.69271592, 111.71251324, 111.73231796,\n", + " 111.75213008, 111.77194961, 111.79177654, 111.81161089,\n", + " 111.83145265, 111.85130183, 111.87115844, 111.89102248,\n", + " 111.91089395, 111.93077285, 111.9506592 , 111.97055299,\n", + " 111.99045423, 112.01036292, 112.03027907, 112.05020268,\n", + " 112.07013375, 112.09007229, 112.1100183 , 112.12997179,\n", + " 112.14993276, 112.16990121, 112.18987715, 112.20986058,\n", + " 112.22985151, 112.24984994, 112.26985588, 112.28986932,\n", + " 112.30989027, 112.32991874, 112.34995473, 112.36999824,\n", + " 112.39004929, 112.41010786, 112.43017397, 112.45024762,\n", + " 112.47032882, 112.49041756, 112.51051386, 112.53061771,\n", + " 112.55072913, 112.5708481 , 112.59097465, 112.61110877,\n", + " 112.63125046, 112.65139974, 112.6715566 , 112.69172105,\n", + " 112.71189309, 112.73207273, 112.75225997, 112.77245482,\n", + " 112.79265727, 112.81286734, 112.83308503, 112.85331033,\n", + " 112.87354326, 112.89378383, 112.91403202, 112.93428785,\n", + " 112.95455133, 112.97482245, 112.99510122, 113.01538764,\n", + " 113.03568172, 113.05598347, 113.07629288, 113.09660996,\n", + " 113.11693472, 113.13726715, 113.15760727, 113.17795507,\n", + " 113.19831057, 113.21867376, 113.23904465, 113.25942324,\n", + " 113.27980954, 113.30020356, 113.32060528, 113.34101473,\n", + " 113.3614319 , 113.3818568 , 113.40228944, 113.42272981,\n", + " 113.44317792, 113.46363377, 113.48409737, 113.50456873,\n", + " 113.52504785, 113.54553472, 113.56602936, 113.58653177,\n", + " 113.60704196, 113.62755992, 113.64808567, 113.6686192 ,\n", + " 113.68916052, 113.70970964, 113.73026655, 113.75083127,\n", + " 113.7714038 , 113.79198414, 113.81257229, 113.83316827,\n", + " 113.85377207, 113.87438369, 113.89500315, 113.91563045,\n", + " 113.93626559, 113.95690857, 113.9775594 , 113.99821809,\n", + " 114.01888463, 114.03955904, 114.06024131, 114.08093145,\n", + " 114.10162947, 114.12233537, 114.14304914, 114.16377081,\n", + " 114.18450037, 114.20523783, 114.22598318, 114.24673644,\n", + " 114.26749761, 114.28826669, 114.30904369, 114.32982861,\n", + " 114.35062146, 114.37142224, 114.39223095, 114.4130476 ])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/python/pyproject.toml b/python/pyproject.toml index 58de658c1..a4d3d277b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ name = "yaeos" description = "Thermodynamic modelling with Equation of State" readme = "README.md" dependencies = ["numpy"] -version = "2.1.0" +version = "2.3.0" requires-python = ">=3.10" diff --git a/python/tests/models/gibbs_excess/test_same_as_fortran.py b/python/tests/models/gibbs_excess/test_same_as_fortran.py new file mode 100644 index 000000000..8afdc34f9 --- /dev/null +++ b/python/tests/models/gibbs_excess/test_same_as_fortran.py @@ -0,0 +1,194 @@ +from pathlib import Path + +import numpy as np + +import pytest + +from yaeos import NRTL, UNIFACVLE, UNIQUAC + + +data_path = ( + Path(__file__).parent.parent.parent.parent.parent / "ge_test_vals.txt" +) + + +def test_same_as_fortran(): + # ========================================================================= + # Read data + # ========================================================================= + if not data_path.exists(): + pytest.skip("Test data not found: GeModels same as fortran") + + with open(data_path, "r") as f: + data_lines = f.readlines() + + # ========================================================================= + # Setup models + # ========================================================================= + # NRTL + a = np.array( + [ + [0.0, -0.801, -0.351], + [-0.523, 0.0, 0.214], + [0.127, 0.211, 0.0], + ] + ) + + b = np.array( + [ + [0.0, -586.1, 246.2], + [301.2, 0.0, -104.2], + [150.23, -114.78, 0.0], + ] + ) + + c = np.array( + [ + [0.0, 0.3, 0.3], + [0.3, 0.0, 0.3], + [0.3, 0.3, 0.0], + ] + ) + + nrtl = NRTL(a, b, c) + + # UNIFAC VLE + groups = [{1: 2, 2: 4}, {1: 1, 2: 1, 14: 1}, {9: 5, 11: 1}] + + unifac = UNIFACVLE(groups) + + # UNIQUAC + aij = np.array( + [ + [0.0, -75.46, -60.15], + [120.20, 0.0, 44.22], + [120.20, 33.21, 0.0], + ] + ) + + bij = np.array( + [ + [0.0, -0.10062, 0.2566], + [0.44835, 0.0, -0.01325], + [0.44835, 0.124, 0.0], + ] + ) + + cij = np.array( + [ + [0.0, -0.0008052, 0.00021], + [0.0004704, 0.0, -0.00033], + [0.0004704, -0.000247, 0.0], + ] + ) + + dij = np.array( + [ + [0.0, -0.001, 0.0002], + [-0.001, 0.0, 0.0002], + [-0.001, 0.0002, 0.0], + ] + ) + + eij = np.array( + [ + [0.0, -0.00001, 0.00001], + [-0.00001, 0.0, 0.00001], + [-0.00001, 0.00001, 0.0], + ] + ) + + rs = [0.92, 2.1055, 1.5] + qs = [1.4, 1.972, 1.4] + + uniquac = UNIQUAC(qs, rs, aij, bij, cij, dij, eij) + + # ========================================================================= + # Models dictionary + # ========================================================================= + models = { + "NRTL": nrtl, + "UNIFAC": unifac, + "UNIQUAC": uniquac, + } + + # ========================================================================= + # Test models + # ========================================================================= + n = [15.9754, 3.125, 24.6721] + temp = 320.0 + + for line in data_lines: + values = line.split(",") + + values = [v.strip() for v in values] + + model_name = values[0] + model = models[model_name] + + thermoprops = [float(v) for v in values[1:]] + + ge, get, get2 = thermoprops[0:3] + gen = thermoprops[3:6] + getn = thermoprops[6:9] + gen2 = np.reshape(thermoprops[9:18], (3, 3)) + + ( + he, + het, + ) = thermoprops[18:20] + hen = thermoprops[20:23] + + se, se_t = thermoprops[23:25] + sen = thermoprops[25:28] + + lngamma = thermoprops[28:31] + dlngamma_dt = thermoprops[31:34] + dlngamma_dn = np.reshape(thermoprops[34:], (3, 3)) + + # Test GE + ge_v, derivatives = model.excess_gibbs( + n, temp, dt=True, dt2=True, dn=True, dtn=True, dn2=True + ) + + ge_i = model.excess_gibbs(n, temp) + + assert np.isclose(ge_i, ge_v, rtol=1e-10) + assert np.isclose(ge, ge_v, rtol=1e-10) + assert np.isclose(get, derivatives["dt"], rtol=1e-10) + assert np.isclose(get2, derivatives["dt2"], rtol=1e-10) + assert np.allclose(gen, derivatives["dn"], rtol=1e-10) + assert np.allclose(getn, derivatives["dtn"], rtol=1e-10) + assert np.allclose(gen2, derivatives["dn2"], rtol=1e-10) + + # Test HE + he_v, derivatives = model.excess_enthalpy(n, temp, dt=True, dn=True) + + he_i = model.excess_enthalpy(n, temp) + + assert np.isclose(he_i, he_v, rtol=1e-10) + assert np.isclose(he, he_v, rtol=1e-10) + assert np.isclose(het, derivatives["dt"], rtol=1e-10) + assert np.allclose(hen, derivatives["dn"], rtol=1e-10) + + # Test SE + se_v, derivatives = model.excess_entropy(n, temp, dt=True, dn=True) + + se_i = model.excess_entropy(n, temp) + + assert np.isclose(se_i, se_v, rtol=1e-10) + assert np.isclose(se, se_v, rtol=1e-10) + assert np.isclose(se_t, derivatives["dt"], rtol=1e-10) + assert np.allclose(sen, derivatives["dn"], rtol=1e-10) + + # Test ln(gamma) + lngamma_v, derivatives = model.ln_gamma(n, temp, dt=True, dn=True) + + lngamma_i = model.ln_gamma(n, temp) + + assert np.allclose(lngamma_i, lngamma_v, rtol=1e-10) + assert np.allclose(lngamma, lngamma_v, rtol=1e-10) + assert np.allclose(dlngamma_dt, derivatives["dt"], rtol=1e-10) + assert np.allclose(dlngamma_dn, derivatives["dn"], rtol=1e-10) + + data_path.unlink() diff --git a/python/tox.ini b/python/tox.ini index af3a8060a..1e83614a1 100644 --- a/python/tox.ini +++ b/python/tox.ini @@ -23,9 +23,11 @@ python = deps = ipdb pytest + fpm skip_install = True usedevelop = False commands = + fpm run ge_python_test_values pip install . pytest tests/ {posargs} --import-mode=importlib @@ -71,6 +73,7 @@ deps = pytest-cov commands = coverage erase + fpm run ge_python_test_values pip install . pytest tests/ --import-mode=importlib --cov={envsitepackagesdir}/yaeos --cov-append --cov-report=term-missing coverage report --fail-under=70 -m diff --git a/python/yaeos/__init__.py b/python/yaeos/__init__.py index 5c80c0c8f..39ac634fe 100644 --- a/python/yaeos/__init__.py +++ b/python/yaeos/__init__.py @@ -4,8 +4,9 @@ relevant constants, procedures and objects to have better access to them. """ -__version__ = "2.1.0" +import importlib.metadata +import yaeos.constants as constants from yaeos.lib import yaeos_c from yaeos.models.excess_gibbs import NRTL, UNIFACVLE, UNIQUAC from yaeos.models.residual_helmholtz.cubic_eos import ( @@ -22,6 +23,7 @@ __all__ = [ + "constants", "yaeos_c", "SoaveRedlichKwong", "PengRobinson76", @@ -36,3 +38,6 @@ "MHV", "HV", ] + + +__version__ = importlib.metadata.version("yaeos") diff --git a/python/yaeos/core.py b/python/yaeos/core.py index 19c0264a5..a7f6e407d 100644 --- a/python/yaeos/core.py +++ b/python/yaeos/core.py @@ -15,8 +15,10 @@ class GeModel(ABC): """Excess Gibbs (Ge) model abstract class.""" - def ln_gamma(self, moles, temperature): - r"""Calculate activity coefficients. + def ln_gamma( + self, moles, temperature: float, dt: bool = False, dn: bool = False + ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: + r"""Calculate natural logarithm of activity coefficients. Calculate :math:`\ln \gamma_i(n,T)` vector. @@ -47,9 +49,253 @@ def ln_gamma(self, moles, temperature): nrtl = NRTL(a, b, c) + # Evaluating ln_gamma only print(nrtl.ln_gamma([5.0, 5.6], 300.0)) + + # Asking for derivatives + + print(nrtl.ln_gamma([5.0, 5.6], 300.0, dt=True, dn=True)) + """ + nc = len(moles) + + dt = np.empty(nc, order="F") if dt else None + dn = np.empty((nc, nc), order="F") if dn else None + + res = yaeos_c.ln_gamma_ge( + self.id, + moles, + temperature, + dlngamma_dt=dt, + dlngamma_dn=dn, + ) + + if dt is None and dn is None: + ... + else: + res = (res, {"dt": dt, "dn": dn}) + return res + + def excess_gibbs( + self, + moles, + temperature: float, + dt: bool = False, + dt2: bool = False, + dn: bool = False, + dtn: bool = False, + dn2: bool = False, + ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: + """Calculate excess Gibbs energy [bar L]. + + Parameters + ---------- + moles : array_like + Moles number vector [mol] + temperature : float + Temperature [K] + dt : bool, optional + Calculate temperature derivative, by default False + dt2 : bool, optional + Calculate temperature second derivative, by default False + dn : bool, optional + Calculate moles derivative, by default False + dtn : bool, optional + Calculate cross temperature and moles derivative, by default False + dn2 : bool, optional + Calculate moles second derivative, by default False + + Returns + ------- + Union[np.ndarray, tuple[np.ndarray, dict]] + Excess Gibbs energy or tuple with excess Gibbs energy and + derivatives dictionary if any derivative is asked [bar L] + + Example + ------- + .. code-block:: python + + from yaeos import UNIFACVLE + + # Ethanol - water system + groups = [{1: 2, 2: 1, 14: 1}, {16: 1}] + + model = UNIFACVLE(groups) + + # Evaluating excess Gibbs energy only + print(model.excess_gibbs(model.excess_gibbs([0.5,0.5], 303.15)) + + # Asking for derivatives + print( + model.excess_gibbs( + [0.5,0.5], + 303.15, + dt=True, + dt2=True, + dn=True, + dtn=True, + dn2=True + ) + """ + nc = len(moles) + + dt = np.empty(1, order="F") if dt else None + dt2 = np.empty(1, order="F") if dt2 else None + dn = np.empty(nc, order="F") if dn else None + dtn = np.empty(nc, order="F") if dtn else None + dn2 = np.empty((nc, nc), order="F") if dn2 else None + + all_none = ( + dt is None + and dt2 is None + and dn is None + and dtn is None + and dn2 is None + ) + + res = yaeos_c.excess_gibbs_ge( + self.id, + moles, + temperature, + get=dt, + get2=dt2, + gen=dn, + getn=dtn, + gen2=dn2, + ) + + if all_none: + ... + else: + res = ( + res, + { + "dt": dt if dt is None else dt[0], + "dt2": dt2 if dt2 is None else dt2[0], + "dn": dn, + "dtn": dtn, + "dn2": dn2, + }, + ) + + return res + + def excess_enthalpy( + self, moles, temperature: float, dt: bool = False, dn: bool = False + ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: + """Calculate excess enthalpy [bar L]. + + Parameters + ---------- + moles : array_like + Moles number vector [mol] + temperature : float + Temperature [K] + dt : bool, optional + Calculate temperature derivative, by default False + dn : bool, optional + Calculate moles derivative, by default False + + Returns + ------- + Union[np.ndarray, tuple[np.ndarray, dict]] + Excess enthalpy or tuple with excess enthalpy and derivatives + dictionary if any derivative is asked [bar L] + + Example + ------- + .. code-block:: python + + from yaeos import UNIFACVLE + + # Ethanol - water system + groups = [{1: 2, 2: 1, 14: 1}, {16: 1}] + + model = UNIFACVLE(groups) + + # Evaluating excess enthalpy only + print(model.excess_enthalpy([0.5, 0.5], 303.15)) + + # Asking for derivatives + print(model.excess_enthalpy([0.5, 0.5], 303.15, dt=True, dn=True)) + """ + nc = len(moles) + + dt = np.empty(1, order="F") if dt else None + dn = np.empty(nc, order="F") if dn else None + + res = yaeos_c.excess_enthalpy_ge( + self.id, + moles, + temperature, + het=dt, + hen=dn, + ) + + if dt is None and dn is None: + ... + else: + res = (res, {"dt": dt if dt is None else dt[0], "dn": dn}) + + return res + + def excess_entropy( + self, moles, temperature: float, dt: bool = False, dn: bool = False + ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: + """Calculate excess entropy [bar L / K]. + + Parameters + ---------- + moles : array_like + Moles number vector [mol] + temperature : float + Temperature [K] + dt : bool, optional + Calculate temperature derivative, by default False + dn : bool, optional + Calculate moles derivative, by default False + + Returns + ------- + Union[np.ndarray, tuple[np.ndarray, dict]] + Excess entropy or tuple with excess entropy and derivatives + dictionary if any derivative is asked [bar L / K] + + Example + ------- + .. code-block:: python + + from yaeos import UNIFACVLE + + # Ethanol - water system + groups = [{1: 2, 2: 1, 14: 1}, {16: 1}] + + model = UNIFACVLE(groups) + + # Evaluating excess entropy only + print(model.excess_entropy([0.5, 0.5], 303.15)) + + # Asking for derivatives + print(model.excess_entropy([0.5, 0.5], 303.15, dt=True, dn=True)) """ - return yaeos_c.ln_gamma(self.id, moles, temperature) + nc = len(moles) + + dt = np.empty(1, order="F") if dt else None + dn = np.empty(nc, order="F") if dn else None + + res = yaeos_c.excess_entropy_ge( + self.id, + moles, + temperature, + set=dt, + sen=dn, + ) + + if dt is None and dn is None: + ... + else: + res = (res, {"dt": dt if dt is None else dt[0], "dn": dn}) + + return res def __del__(self) -> None: """Delete the model from the available models list (Fortran side).""" @@ -732,6 +978,52 @@ def cp_residual_vt( """ return yaeos_c.cp_residual_vt(self.id, moles, volume, temperature) + def pure_saturation_pressures( + self, component, stop_pressure=0.01, stop_temperature=100 + ): + """Calculate pure component saturation pressures [bar]. + + Calculation starts from the critical point and goes down to the + stop pressure or stop temperature. + + Parameters + ---------- + component : int + Component index (starting from 1) + stop_pressure : float, optional + Stop pressure [bar], by default 0.01 + stop_temperature : float, optional + Stop temperature [K], by default 100 + + Returns + ------- + dict + Pure component saturation points dictionary with keys: + - T: Temperature [K] + - P: Pressure [bar] + - Vx: Liquid Phase Volume [L/mole] + - Vy: Vapor Phase Volume [L/mole] + + Example + ------- + .. code-block:: python + + import numpy as np + + from yaeos import PengRobinson76 + + tc = np.array([320.0, 375.0]) + pc = np.array([45.0, 60.0]) + w = np.array([0.0123, 0.045]) + + model = PengRobinson76(tc, pc, w) + """ + P, T, Vx, Vy = yaeos_c.pure_saturation_line( + self.id, component, stop_pressure, stop_temperature + ) + + return {"T": T, "P": P, "Vx": Vx, "Vy": Vy} + def flash_pt( self, z, pressure: float, temperature: float, k0=None ) -> dict: @@ -1082,11 +1374,73 @@ def phase_envelope_pt( return res + def phase_envelope_px( + self, + z0, + zi, + temperature, + kind="bubble", + max_points=300, + p0=10.0, + a0=0.001, + ds0=0.1, + ): + """Two phase envelope calculation (PX). + + Calculation of a phase envelope that starts at a given composition and + its related to another composition with some proportion. + + Parameters + ---------- + z0 : array_like + Initial global mole fractions + zi : array_like + Final global mole fractions + temperature : float + Temperature [K] + kind : str, optional + Kind of saturation point to start the envelope calculation, + defaults to "bubble". Options are + - "bubble" + - "dew" + max_points : int, optional + Envelope's maximum points to calculate (P, X), by default 300 + p0 : float, optional + Initial guess for pressure [bar] for the saturation point of kind: + `kind`, by default 10.0 + a0 : float, optional + Initial molar fraction of composition `zi`, by default 0.001 + ds0 : float, optional + Step for a, by default 0.1 + """ + + a, ps, xs, ys, acs, pcs, kinds = yaeos_c.px2_phase_envelope( + self.id, + z0=z0, + zi=zi, + kind=kind, + max_points=max_points, + p0=p0, + a0=a0, + t=temperature, + ds0=ds0, + ) + + return { + "a": a, + "P": ps, + "x": xs, + "y": ys, + "ac": acs, + "Pc": pcs, + "kind": kinds, + } + def stability_analysis(self, z, pressure, temperature): """Perform stability analysis. Find all the possible minima values that the :math:`tm` function, - defined by Michelsen and Møllerup. + defined by Michelsen and Mollerup. Parameters ---------- @@ -1101,25 +1455,33 @@ def stability_analysis(self, z, pressure, temperature): ------- dict Stability analysis result dictionary with keys: - - w_min: + - w: value of the test phase that minimizes the :math:`tm` function - - tm_min: + - tm: minimum value of the :math:`tm` function - - all_mins_w: - all values of :math:`w` that minimize the - :math:`tm` function + dict + All found minimum values of the :math:`tm` function and the + corresponding test phase mole fractions. + - w: + all values of :math:`w` that minimize the + :math:`tm` function + - tm: + all values found minima of the :math:`tm` function """ - (w_min, tm_min, all_mins_w) = yaeos_c.stability_zpt( + (w_min, tm_min, all_mins, all_mins_w) = yaeos_c.stability_zpt( id=self.id, z=z, p=pressure, t=temperature ) - return {"w_min": w_min, "tm_min": tm_min, "all_mins_w": all_mins_w} + return {"w": w_min, "tm": tm_min}, { + "tm": all_mins, + "w": all_mins_w, + } def stability_tm(self, z, w, pressure, temperature): """Calculate the :math:`tm` function. - Calculate the :math:`tm` function, defined by Michelsen and Møllerup. + Calculate the :math:`tm` function, defined by Michelsen and Mollerup. If this value is negative, it means that the feed with composition `z` is unstable. @@ -1128,7 +1490,7 @@ def stability_tm(self, z, w, pressure, temperature): z : array_like Global mole fractions w : array_like - Test Phase mole fractions + Test Phase mole fractions pressure : float Pressure [bar] temperature : float @@ -1166,7 +1528,9 @@ def critical_point(self, z, max_iters=100) -> dict: return {"x": x, "Tc": t, "Pc": p, "Vc": v} - def critical_line(self, z0, zi, a0=1e-5, da0=1e-2, max_points=1000): + def critical_line( + self, z0, zi, a0=1e-5, da0=1e-2, max_points=1000, stop_pressure=2500 + ): """Critical Line calculation. Calculate the critical line between two compositions @@ -1181,11 +1545,19 @@ def critical_line(self, z0, zi, a0=1e-5, da0=1e-2, max_points=1000): Initial molar fraction of composition `i` da0: float, optional Step for molar fraction of composition `i` - max_poitns: int, optional + max_points: int, optional Maximum number of points to calculate + stop_pressure: float, optional + Stop when reaching this pressure value """ alphas, vs, ts, ps = yaeos_c.critical_line( - self.id, a0=a0, da0=da0, z0=z0, zi=zi, max_points=max_points + self.id, + a0=a0, + da0=da0, + z0=z0, + zi=zi, + max_points=max_points, + stop_pressure=stop_pressure, ) return {"a": alphas, "T": ts, "P": ps, "V": vs} diff --git a/src/adiff/autodiff_api/armodel_adiff_api.f90 b/src/adiff/autodiff_api/armodel_adiff_api.f90 index 0ea8d329f..a7858a625 100644 --- a/src/adiff/autodiff_api/armodel_adiff_api.f90 +++ b/src/adiff/autodiff_api/armodel_adiff_api.f90 @@ -79,7 +79,12 @@ subroutine residual_helmholtz(& type(hyperdual) :: d_v, d_t, d_n(size(n)) type(hyperdual) :: d_Ar + logical :: any_deriv + + any_deriv = .false. + if (present(ArV)) then + any_deriv = .true. if (present(ArV2)) call get_dardv2 if (present(ArVn)) call get_dardvn if (present(ArTV)) call get_dardvt @@ -88,13 +93,19 @@ subroutine residual_helmholtz(& end if if (present(ArT)) then + any_deriv = .true. if (present(ArT2)) call get_dardt2 if (.not. (present(ArT2) .and. present(ArTn))) call get_dardt end if - if (present(ArTn)) call get_dardtn + if (present(ArTn)) then + any_deriv = .true. + call get_dardtn + end if + if (present(Arn)) then + any_deriv = .true. if (present(Arn2)) then call get_dardn2 else @@ -102,7 +113,13 @@ subroutine residual_helmholtz(& end if end if - if (present(Ar)) Ar = d_Ar%f0 + if (present(Ar)) then + if (.not. any_deriv) then + call reset_vars + d_ar = self%Ar(d_n, d_v, d_t) + end if + Ar = d_Ar%f0 + end if contains diff --git a/src/adiff/autodiff_api/gemodel_adiff_api.f90 b/src/adiff/autodiff_api/gemodel_adiff_api.f90 new file mode 100644 index 000000000..b246fd1ce --- /dev/null +++ b/src/adiff/autodiff_api/gemodel_adiff_api.f90 @@ -0,0 +1,162 @@ +module yaeos__adiff_hyperdual_ge_api + !! Module that contains the automatic differentiation logic for an Ge model. + !! + !! All that is needed to define an Ge model that uses automatic + !! differentiation with hyperdual numbers is to define a new derived type + !! that overloads the method to the Ge function that you want to use. + use yaeos__constants, only: pr + use yaeos__models_ge, only: GeModel + use hyperdual_mod + + implicit none + + type, abstract, extends(GeModel) :: GeModelAdiff + contains + procedure(hyperdual_ge), deferred :: Ge + procedure :: excess_gibbs => excess_gibbs + end type GeModelAdiff + + abstract interface + type(hyperdual) function hyperdual_Ge(self, n, t) + import hyperdual, GeModelAdiff + class(GeModelAdiff) :: self + type(hyperdual), intent(in) :: n(:) + type(hyperdual), intent(in) :: t + end function hyperdual_Ge + end interface +contains + + subroutine excess_gibbs(self, n, T, Ge, GeT, GeT2, Gen, GeTn, Gen2) + class(GeModelAdiff), intent(in) :: self + real(pr), intent(in) :: n(:) + real(pr), intent(in) :: t + real(pr), optional, intent(out) :: Ge, GeT, GeT2 + real(pr), optional, dimension(size(n)), intent(out) :: Gen, GeTn + real(pr), optional, intent(out) :: Gen2(size(n), size(n)) + + type(hyperdual) :: d_t, d_n(size(n)) + type(hyperdual) :: d_Ge + + real(pr) :: dGe(size(n)+1, size(n)+1) + integer :: nc + + logical :: any_deriv + + any_deriv = .false. + + nc = size(n) + + if (present(GeT) .or. present(GeT2)) then + any_deriv = .true. + if (present(GeT2)) then + call get_dgedt2 + end if + + if (.not. (present(GeT2) .and. .not. present(GeTn))) then + call get_dgedt + end if + end if + + if (present(GeTn)) then + any_deriv = .true. + call get_dgedtn + end if + + + if (present(Gen) .or. present(Gen2)) then + any_deriv = .true. + if (present(Gen2)) then + call get_dgedn2 + else + call get_dgedn + end if + end if + + if (present(Ge)) then + if (.not. any_deriv) then + call reset_vars + d_ge = self%Ge(d_n, d_t) + end if + Ge = d_ge%f0 + end if + + contains + + subroutine get_dgedn() + integer :: i, j + + do i=2, size(n), 2 + call reset_vars + d_n(i-1)%f1 = 1 + d_n(i )%f2 = 1 + + d_Ge = self%Ge(d_n, d_t) + + Gen(i-1) = d_Ge%f1 + Gen(i) = d_Ge%f2 + end do + + if (mod(size(n), 2) /= 0) then + call reset_vars + d_n(size(n))%f1 = 1 + d_Ge = self%Ge(d_n, d_t) + Gen(size(n)) = d_Ge%f1 + end if + + end subroutine get_dgedn + + subroutine get_dgedn2() + integer :: i, j + + do i=1,size(n) + do j=i,size(n) + call reset_vars + d_n(i)%f1 = 1 + d_n(j)%f2 = 1 + + d_Ge = self%Ge(d_n, d_t) + + if(present(Gen)) Gen(i) = d_Ge%f1 + Gen2(i, j) = d_Ge%f12 + Gen2(j, i) = d_Ge%f12 + end do + end do + end subroutine get_dgedn2 + + subroutine get_dgedtn() + integer :: i + + do i=1,size(n) + call reset_vars + d_n(i)%f1 = 1 + d_t%f2 = 1 + d_Ge = self%Ge(d_n, d_t) + if (present(Gen)) Gen(i) = d_Ge%f1 + if (present(GeT)) GeT = d_Ge%f2 + GeTn(i) = d_Ge%f12 + end do + end subroutine get_dgedtn + + subroutine get_dgedt() + call reset_vars + d_t%f1 = 1 + d_Ge = self%Ge(d_n, d_t) + GeT = d_Ge%f1 + end subroutine get_dgedt + + subroutine get_dgedt2() + call reset_vars + d_t%f1 = 1 + d_t%f2 = 1 + d_Ge = self%Ge(d_n, d_t) + if (present(GeT)) GeT = d_Ge%f1 + if (present(GeT2)) GeT2 = d_Ge%f12 + end subroutine get_dgedt2 + + subroutine reset_vars() + d_n = n + d_t = t + end subroutine reset_vars + end subroutine excess_gibbs + +end module yaeos__adiff_hyperdual_ge_api diff --git a/src/adiff/autodiff_api/tapenade_ar_api.f90 b/src/adiff/autodiff_api/tapenade_ar_api.f90 index 6b4d70779..5c371daeb 100644 --- a/src/adiff/autodiff_api/tapenade_ar_api.f90 +++ b/src/adiff/autodiff_api/tapenade_ar_api.f90 @@ -16,9 +16,7 @@ module yaeos__tapenade_ar_api procedure(tapenade_ar_b), deferred :: ar_b procedure(tapenade_ar_d_b), deferred :: ar_d_b procedure(tapenade_ar_d_d), deferred :: ar_d_d - procedure(tapenade_v0), deferred :: v0 procedure :: residual_helmholtz => residual_helmholtz - procedure :: get_v0 => get_v0 end type abstract interface @@ -73,13 +71,6 @@ subroutine tapenade_ar_d_d(model, n, nd, v, vd0, vd, t, td0, td, & real(pr), intent(in) :: nd(:), vd, td real(pr), intent(out) :: arval, arvald0, arvald, arvaldd end subroutine - - pure function tapenade_v0(model, n, p, t) - import pr, ArModelTapenade - class(ArModelTapenade), intent(in) :: model - real(pr), intent(in) :: n(:), p, t - real(pr) :: tapenade_v0 - end function end interface contains @@ -217,12 +208,4 @@ function get_ArnX(var) get_ArnX = nb end function end subroutine - - function get_v0(self, n, p, t) - class(ArModelTapenade), intent(in) :: self - real(pr), intent(in) :: n(:), p, t - real(pr) :: get_v0 - - get_v0 = self%v0(n, p, t) - end function end module diff --git a/src/adiff/autodiff_api/tapenade_ge_api.f90 b/src/adiff/autodiff_api/tapenade_ge_api.f90 index 44bdbf086..077f60d1e 100644 --- a/src/adiff/autodiff_api/tapenade_ge_api.f90 +++ b/src/adiff/autodiff_api/tapenade_ge_api.f90 @@ -118,6 +118,7 @@ subroutine excess_gibbs(& Gen = nb if (present(GeT)) GeT = tb else + if (present(GeT)) GeT = get_dGedT() end if if (present(GeTn)) GeTn = get_GenT() @@ -159,6 +160,18 @@ function get_dGedT2() get_dGedT2 = gedd end function + function get_dGedT() + real(pr) :: get_dGedT + call reset_vars + + td = 1 + + call self%ge_d(& + n, nd, t, td, ge, ged & + ) + get_dGedT = ged + end function + function get_GenT() real(pr) :: get_GenT(size(n)) call reset_vars diff --git a/src/equilibria/boundaries/phase_envelopes_pt.f90 b/src/equilibria/boundaries/phase_envelopes_pt.f90 index 722ec65ca..2b39443d7 100644 --- a/src/equilibria/boundaries/phase_envelopes_pt.f90 +++ b/src/equilibria/boundaries/phase_envelopes_pt.f90 @@ -198,15 +198,6 @@ subroutine foo(X, ns, S, F, dF, dFdS) df(nc + 1, :nc) = y - do i=1,nc - if (z(i) == 0) then - F(i) = 0 - df(:, i) = 0 - ! df(i, :) = 0 - df(i, i) = 1 - end if - end do - df(nc + 2, :) = 0 df(nc + 2, ns) = 1 diff --git a/src/equilibria/boundaries/phase_envelopes_tx.f90 b/src/equilibria/boundaries/phase_envelopes_tx.f90 new file mode 100644 index 000000000..3c1b1643c --- /dev/null +++ b/src/equilibria/boundaries/phase_envelopes_tx.f90 @@ -0,0 +1,410 @@ +module yaeos__equilibria_boundaries_phase_envelopes_tx + !! Phase boundaries line on the \(T\alpha\) plane calculation procedures. + use yaeos__constants, only: pr + use yaeos__models, only: ArModel + use yaeos__equilibria_equilibrium_state, only: EquilibriumState + use yaeos__math_continuation, only: & + continuation, continuation_solver, continuation_stopper + implicit none + + type :: CriticalPoint + !! Critical point + real(pr) :: alpha !! \(\alpha\) + real(pr) :: T !! Temperature [K] + end type CriticalPoint + + type :: TXEnvel2 + !! Two-phase TX envelope. + !! Phase boundary line of a fluid at constant temperature + !! with variation in composition. + real(pr), allocatable :: alpha(:) !! Second fluid molar fraction + real(pr), allocatable :: z0(:) !! Original fluid composition + real(pr), allocatable :: z_inj(:) !! Second fluid composition + type(EquilibriumState), allocatable :: points(:) + !! Each point through the line. + type(CriticalPoint), allocatable :: cps(:) + !! Critical points found along the line. + end type TXEnvel2 + + + ! Private volumes of each phase to share between functions + real(pr), private :: Vz !! Main phase volume [L/mol] + real(pr), private :: Vy !! Incipient phase volume [L/mol] + +contains + + function tx_envelope_2ph(& + model, z0, alpha0, z_injection, first_point, & + points, iterations, delta_0, specified_variable_0, & + solver, stop_conditions & + ) result(envelopes) + !! TX two-phase envelope calculation procedure. + !! + !! Phase envelope calculation using the continuation method. + !! Defaults to solving the saturation temperature and continues with + !! an increment in it. The variable to specify can be changed by modifying + !! `specified_variable_0` with the corresponding variable number. + ! ======================================================================== + use stdlib_optval, only: optval + class(ArModel), intent(in) :: model + !! Thermodyanmic model + real(pr), intent(in) :: z0(:) + !! Vector of molar fractions of the global composition (main phase) + real(pr), intent(in) :: alpha0 + !! First point of \(alpha\) + real(pr), intent(in) :: z_injection(:) + !! Vector of molar fractions of the injection fluid + type(EquilibriumState) :: first_point + integer, optional, intent(in) :: points + !! Maxmimum number of points, defaults to 500 + integer, optional, intent(in) :: iterations + !! Point solver maximum iterations, defaults to 100 + real(pr), optional, intent(in) :: delta_0 + !! Initial extrapolation \(\Delta\) + integer, optional, intent(in) :: specified_variable_0 + !! Position of specified variable, since the vector of variables is + !! \(X = [lnK_i, \dots, lnP, \alpha]\) the values for specification + !! will be \([1 \dots nc]\) for the equilibria constants, \(nc+1\) for + !! \(lnP\) and \(nc + 2\) for \(\alpha\). + procedure(continuation_solver), optional :: solver + !! Specify solver for each point, defaults to a full newton procedure + procedure(continuation_stopper), optional :: stop_conditions + !! Function that returns true if the continuation method should stop + type(TXEnvel2) :: envelopes + ! ------------------------------------------------------------------------ + + integer :: nc !! Number of components + integer :: ns !! Number of specified variable + real(pr) :: dS0 !! Initial specification step + real(pr) :: S0 !! Initial specification value + real(pr) :: z(size(z0)) !! Composition at some point + + integer :: max_points !! Maximum number of points + integer :: max_iterations !! Maximum number of iterations + + real(pr) :: X(size(z) + 2), P + real(pr), allocatable :: XS(:, :) + + character(len=14) :: kind + + ! ======================================================================== + ! Handle input + ! ------------------------------------------------------------------------ + call get_z(alpha0, z0, z_injection, z) + kind = first_point%kind + nc = size(z) + max_points = optval(points, 500) + max_iterations = optval(iterations, 100) + ns = optval(specified_variable_0, nc+2) + dS0 = optval(delta_0, 0.1_pr) + + ! Correctly define the K-values based on the provided incipient point. + select case(first_point%kind) + case("bubble", "liquid-liquid") + X(:nc) = log(first_point%y/z) + case("dew") + X(:nc) = log(first_point%x/z) + end select + + P = first_point%P + + X(nc+1) = log(first_point%T) + X(nc+2) = alpha0 + + S0 = X(ns) + + allocate(envelopes%points(0), envelopes%cps(0), envelopes%alpha(0)) + + test_numdiff: block + real(pr) :: F(size(X)), df(size(X), size(X)), numdiff(size(X), size(X)) + real(pr) :: FdX(size(X)), dx(size(X)), dFdS(size(X)) + real(pr) :: FdX2(size(X)) + integer :: i + integer :: loc(2) + real(pr) :: maxerr + exit test_numdiff + + do i=1,size(X) + dx = 0 + dx(i) = 1.e-5_pr * X(i) + call foo(X - dx, ns, S0, FdX, df, dFdS) + call foo(X + dx, ns, S0, FdX2, df, dFdS) + call foo(X, ns, S0, F, df, dFdS) + numdiff(:, i) = (FdX2 - FdX)/(2*dx(i)) + end do + + loc = maxloc(abs(numdiff - df)) + maxerr = abs(& + (numdiff(loc(1), loc(2)) - df(loc(1), loc(2))& + )/numdiff(loc(1), loc(2))) + if (maxerr > 0.01_pr) then + write(*, *)"ERROR: TXEnvel2 Numerical differentiation failed" + loc = maxloc(abs(numdiff - df)) + write( *, *)loc + write( *, *)df(loc(1), loc(2)), numdiff(loc(1), loc(2)) + error stop 1 + end if + end block test_numdiff + + + ! ======================================================================== + ! Trace the line using the continuation method. + ! ------------------------------------------------------------------------ + XS = continuation(& + foo, X, ns0=ns, S0=S0, & + dS0=dS0, max_points=max_points, solver_tol=1.e-5_pr, & + update_specification=update_spec, & + solver=solver, stop=stop_conditions & + ) + + contains + + recursive subroutine foo(X, ns, S, F, dF, dFdS) + !! Function that needs to be solved at each envelope point + real(pr), intent(in) :: X(:) + integer, intent(in) :: ns + real(pr), intent(in) :: S + + real(pr), intent(out) :: F(:) + real(pr), intent(out) :: dF(:, :) + real(pr), intent(out) :: dFdS(:) + + character(len=14) :: kind_z, kind_y + + real(pr) :: y(nc) + real(pr) :: lnphip_z(nc), lnphip_y(nc) + real(pr) :: dlnphi_dt_z(nc), dlnphi_dt_y(nc) + real(pr) :: dlnphi_dp_z(nc), dlnphi_dp_y(nc) + real(pr) :: dlnphi_dn_z(nc, nc), dlnphi_dn_y(nc, nc) + + real(pr) :: T, K(nc), alpha, dzda(nc) + + integer :: i, j + + F = 0 + dF = 0 + + K = exp(X(:nc)) + T = exp(X(nc+1)) + alpha = X(nc+2) + + call get_z(alpha, z0, z_injection, z, dzda) + + y = K*z + + select case(kind) + case ("bubble") + kind_z = "liquid" + kind_y = "vapor" + case ("dew") + kind_z = "vapor" + kind_y = "liquid" + case default + kind_z = "stable" + kind_y = "stable" + end select + + call model%lnphi_pt(& + z, P=P, T=T, V=Vz, root_type=kind_z, & + lnphi=lnphip_z, dlnPhidt=dlnphi_dt_z, & + dlnPhidp=dlnphi_dp_z, dlnphidn=dlnphi_dn_z & + ) + call model%lnphi_pt(& + y, P=P, T=T, V=Vy, root_type=kind_y, & + lnphi=lnphip_y, dlnPhidt=dlnphi_dt_y, & + dlnPhidp=dlnphi_dp_y, dlnphidn=dlnphi_dn_y & + ) + + F(:nc) = X(:nc) + lnphip_y - lnphip_z + F(nc + 1) = sum(y - z) + F(nc + 2) = X(ns) - S + + ! Jacobian Matrix + do i = 1, nc + do j = 1, nc + df(i, j) = y(j) * dlnphi_dn_y(i, j) + end do + df(i, i) = df(i, i) + 1 + + df(i, nc + 2) = sum(K*dlnphi_dn_y(i, :)*dzda - dlnphi_dn_z(i, :)*dzda) + end do + + df(:nc, nc + 1) = T*(dlnphi_dT_y - dlnphi_dT_z) + df(nc + 1, :nc) = y + df(nc + 1, nc + 2) = sum(dzda*(K - 1)) + + df(nc + 2, :) = 0 + df(nc + 2, ns) = 1 + + dFdS = 0 + dFdS(nc+2) = -1 + end subroutine foo + + subroutine update_spec(X, ns, S, dS, dXdS, step_iters) + !! Update the specification during continuation. + real(pr), intent(in out) :: X(:) + !! Vector of variables \([lnK_i \dots , lnT, lnP]\) + integer, intent(in out) :: ns + !! Number of specified variable in the vector + real(pr), intent(in out) :: S + !! Variable specification value + real(pr), intent(in out) :: dS + !! Step in specification + real(pr), intent(in out) :: dXdS(:) + !! Variation of variables with respect to specification + integer, intent(in) :: step_iters + !! Iterations used in the solver + + real(pr) :: maxdS + + ! ===================================================================== + ! Update specification + ! - Dont select T or P near critical points + ! - Update dS wrt specification units + ! - Set step + ! --------------------------------------------------------------------- + if (maxval(abs(X(:nc))) < 0.1_pr .and. abs(Vz - Vy)/maxval([Vz,Vy]) < 0.01) then + ns = maxloc(abs(dXdS(:nc)), dim=1) + maxdS = 0.01_pr + else + ns = maxloc(abs(dXdS(nc+1:)), dim=1) + nc + maxdS = 0.5_pr + end if + + dS = dXdS(ns) * dS + dXdS = dXdS/dXdS(ns) + + + dS = sign(1.0_pr, dS) * minval([ & + max(sqrt(abs(X(ns))/10._pr), 0.1_pr), & + abs(dS)*3/step_iters & + ] & + ) + + do while (maxval(abs(dXdS(:nc)*dS)) < 0.05) + dS = dS*1.1_pr + end do + + call save_point(X, step_iters) + call detect_critical(X, dXdS, ns, S, dS) + end subroutine update_spec + + subroutine save_point(X, iters) + !! Save the converged point + real(pr), intent(in) :: X(:) + integer, intent(in) :: iters + type(EquilibriumState) :: point + + real(pr) :: y(nc), T, alpha + + T = exp(X(nc+1)) + alpha = X(nc+2) + y = exp(X(:nc))*z + + select case(kind) + case("bubble") + point = EquilibriumState(& + kind=kind, x=z, Vx=Vz, y=y, Vy=Vy, & + T=T, P=P, beta=0._pr, iters=iters & + ) + case("dew") + point = EquilibriumState(& + kind=kind, x=y, Vx=Vy, y=z, Vy=Vz, & + T=T, P=P, beta=0._pr, iters=iters & + ) + case default + point = EquilibriumState(& + kind="saturation", x=z, Vx=Vz, y=y, Vy=Vy, & + T=T, P=P, beta=0._pr, iters=iters & + ) + end select + + envelopes%alpha = [envelopes%alpha, alpha] + envelopes%points = [envelopes%points, point] + end subroutine save_point + + subroutine detect_critical(X, dXdS, ns, S, dS) + !! # `detect_critical` + !! Critical point detection + !! + !! # Description + !! If the values of lnK (X[:nc]) change sign then a critical point + !! Has passed, since for this to happen all variables should pass + !! through zero. Near critical points (lnK < 0.05) points are harder + !! to converge, so more steps in the extrapolation vector are made to + !! jump over the critical point. + !! If the critical point is detected then the kind of the point is + !! changed and the point is saved using an interpolation knowing that + !! + !! \[ + !! X_c = a * X + (1-a)*X_{new} + !! \] + !! + !! With \(X_c\) is the variables at the critical point, \(X_{new}\) + !! is the new initialization point of the method and \(a\) is the + !! parameter to interpolate the values. This subroutine finds the + !! value of \(a\) to obtain \(X_c\). + real(pr), intent(in out) :: X(:) !! Vector of variables + real(pr), intent(in out) :: dXdS(:) !! Variation of variables wrt S + integer, intent(in out) :: ns !! Number of specified variable + real(pr), intent(in out) :: S !! Specification value + real(pr), intent(in out) :: dS !! Step in specification + real(pr) :: Xc(nc+2) !! Value at (near) critical point + real(pr) :: a !! Parameter for interpolation + + real(pr) :: Xold(size(X)) !! Old value of X + real(pr) :: Xnew(size(X)) !! Value of the next initialization + + Xold = X + + do while (maxval(abs(X(:nc))) < 0.1_pr .and. abs(Vz - Vy) < 0.01_pr) + ! If near a critical point, jump over it + if (nc == 2) exit + S = S + dS + X = X + dXdS*dS + end do + + Xnew = X + dXdS*dS + + if (all(Xold(:nc) * (Xnew(:nc)) < 0)) then + + select case(kind) + case("dew") + kind = "bubble" + case("bubble") + kind = "dew" + case default + kind = "liquid-liquid" + end select + + ! 0 = a*X(ns) + (1-a)*Xnew(ns) Interpolation equation to get X(ns) = 0 + a = -Xnew(ns)/(X(ns) - Xnew(ns)) + Xc = a * X + (1-a)*Xnew + + envelopes%cps = [& + envelopes%cps, & + CriticalPoint(T=exp(Xc(nc+1)), alpha=Xc(nc+2)) & + ] + X = Xc + dXdS*dS + end if + end subroutine detect_critical + end function tx_envelope_2ph + + subroutine get_z(alpha, z_0, z_inj, z, dzda) + !! Calculate the fluid composition based on an amount of addition + !! of second fluid. + !! + !! The injection can be considered as two kinds of injection: + !! - Displacement: \( z = \alpha z_i + (1-\alpha) z_0 \) + !! - Addition: \( z = \frac{\alpha z_i + (1-\alpha) z_0}{\sum_{i=1}^N \alpha z_i + (1-\alpha) z_0} \) + real(pr), intent(in) :: alpha !! Addition percentaje \( \alpha \) + real(pr), intent(in) :: z_inj(:) + real(pr), intent(in) :: z_0(:) + real(pr), intent(out) :: z(size(z_0)) !! New composition + real(pr), optional, intent(out) :: dzda(size(z_0)) !! Derivative wrt \(\alpha\) + + z = z_inj * alpha + (1.0_pr - alpha)*z_0 + if (present(dzda)) dzda = z_inj - z_0 + end subroutine get_z + +end module yaeos__equilibria_boundaries_phase_envelopes_tx diff --git a/src/equilibria/boundaries/pure_saturation.f90 b/src/equilibria/boundaries/pure_saturation.f90 new file mode 100644 index 000000000..e92d9fd7a --- /dev/null +++ b/src/equilibria/boundaries/pure_saturation.f90 @@ -0,0 +1,301 @@ +module yaeos__equilibria_boundaries_pure_saturation + use yaeos__constants, only: pr + use yaeos__models, only: ArModel, size + use yaeos__math_linalg, only: solve_system + use yaeos__math_continuation, only: & + continuation, continuation_solver, continuation_stopper + use linear_interpolation_module, only: linear_interp_1d + implicit none + + + type :: PurePsat + real(pr), allocatable :: T(:) !! Temperature [K] + real(pr), allocatable :: P(:) !! Pressure [Pa] + real(pr), allocatable :: Vx(:) !! Molar volume [L/mol] in the liquid phase + real(pr), allocatable :: Vy(:) !! Molar volume [L/mol] in the vapor phase + type(linear_interp_1d), private :: interpolator_get_T + type(linear_interp_1d), private :: interpolator_get_P + contains + procedure :: get_T => get_T + procedure :: get_P => get_P + end type PurePsat + +contains + + function pure_saturation_line(model, component, minP, minT) result(pt) + !! # Pure saturation line + !! + !! Saturation pressures and temperatures for a pure component. + !! + !! ## Description + !! This function calculates the saturation line for a pure component. + !! Starting from the pure component critical point, the function traces + !! the saturation line using the continuation method. + !! The function returns a `PurePsat` object with the saturation + !! temperatures and pressures. The object also contains interpolators + !! to get the saturation temperature for a given pressure and vice versa. + !! + ! ======================================================================== + use stdlib_optval, only: optval + class(ArModel), intent(in) :: model !! Thermodyanmic model + integer, intent(in) :: component !! Component index to calculate the line + real(pr), intent(in) :: minP !! Minimum pressure [bar] + real(pr), intent(in) :: minT !! Minimum temperature [K] + type(PurePsat) :: pt + ! ------------------------------------------------------------------------ + + real(pr) :: X(4) !! Variables [lnVx, lnVy, lnP, lnT] + real(pr) :: z(size(model)) + real(pr) :: Vc + integer :: i + integer :: ns + + real(pr) :: Tc, Pc + real(pr) :: Vx, Vy, T, P + + real(pr) :: dXdS(4), dS, S, dFdS(4) + real(pr) :: F(4), dF(4,4) + integer :: its, nc + integer :: points + + nc = size(model) + Tc = model%components%Tc(component) + Pc = model%components%Pc(component) + + z = 0 + z(component) = 1 + call model%volume(z, P=Pc, T=Tc, V=Vc, root_type="vapor") + + Vx = Vc*0.999 + Vy = Vc*1.001 + + X = [log(Vx), log(Vy), log(Pc), log(Tc)] + + ns = 1 + S = log(0.99) + dS = -0.15 + allocate(pt%T(0), pt%P(0), pt%Vx(0), pt%Vy(0)) + + ! ======================================================================== + ! Trace the line using the continuation method. + ! ------------------------------------------------------------------------ + T = Tc + P = Pc + points = 0 + do while(T > minT .and. P > minP .and. .not. isnan(T)) + call solve_point(model, component, nc, X, ns, S, F, dF, dFdS, its) + dXdS = solve_system(dF, -dFdS) + ns = maxloc(abs(dXdS(3:4)), dim=1) + 2 + dS = dXdS(ns)*dS + dXdS = dXdS/dXdS(ns) + + do while (exp(X(4)) - exp(X(4) + dXdS(4)*dS) < 3 .and. ((Tc - T) > 10 .or. (Pc - P) > 2)) + dS = dS*1.5 + end do + + Vx = exp(X(1)) + Vy = exp(X(2)) + P = exp(X(3)) + T = exp(X(4)) + + if (isnan(T)) then + exit + else + pt%T = [pt%T, T] + pt%P = [pt%P, P] + pt%Vx = [pt%Vx, Vx] + pt%Vy = [pt%Vy, Vy] + points = points + 1 + end if + + X = X + dXdS*dS + S = X(ns) + end do + + ! Save interpolators to obtain particular values. The interpolator needs + ! monothonic increasing values in x, so we need to reverse the arrays. + pt%P = pt%P(points:1:-1) + pt%T = pt%T(points:1:-1) + pt%Vx = pt%Vx(points:1:-1) + pt%Vy = pt%Vy(points:1:-1) + + call pt%interpolator_get_T%initialize(pt%P, pt%T, i) + call pt%interpolator_get_P%initialize(pt%T, pt%P, i) + end function pure_saturation_line + + subroutine solve_point(model, ncomp, nc, X, ns, S, F, dF, dFdS, its) + !! # Solve point + !! + !! Solve a saturation point for a pure component. + !! + !! ## Description + !! The set of equations to solve is: + !! + !! \[ + !! \begin{align*} + !! f_1 &= \ln f_{z}(V_z, T) - \ln f_{y}(V_y, T) \\ + !! f_2 &= \ln \left( \frac{P_z}{P_y} \right) \\ + !! f_3 &= \ln P_z - \ln P \\ + !! f_4 &= g(X, ns) + !! \end{align*} + !! \] + !! + !! Where \(f_4\) is an specification function defined as: + !! + !! \[ + !! g(X, ns) = \left\{ + !! \begin{array}{lr} + !! \ln \left( \frac{V_z}{V_y} \right) - S & \text{if } ns = 1 \text{ or } ns = 2 \\ + !! X(ns) - S & \text{otherwise} + !! \end{array} + !! \right\} + !! \] + !! + !! The vector of variables \(X\) is equal to + !! \([ \ln V_z, \ln V_y, \ln P, \ln T ]\). +! + class(ArModel), intent(in) :: model + !! Thermodynamic model + integer, intent(in) :: ncomp + !! Component index + integer, intent(in) :: nc + !! Total number of components + real(pr), intent(in out) :: X(4) + !! Variables \([ln V_z, lnV_y, lnP, lnT]\) + integer, intent(in) :: ns + !! Variable index to solve. If the + real(pr), intent(in) :: S + !! Variable value specified to solve + real(pr), intent(out) :: F(4) + !! Function + real(pr), intent(out) :: dF(4, 4) + !! Jacobian + real(pr), intent(out) :: dFdS(4) + !! Derivative of the function with respect to S + integer, intent(out) :: its + !! Number of iterations + + real(pr) :: z(nc) + real(pr) :: lnfug_z(nc), lnfug_y(nc) + real(pr) :: dlnfdv_z(nc), dlnfdv_y(nc) + real(pr) :: dlnfdt_z(nc), dlnfdt_y(nc) + real(pr) :: dPdTz, dPdTy + real(pr) :: dPdVz, dPdVy + real(pr) :: Vz, Vy + + real(pr) :: T + real(pr) :: Pz, Py + real(pr) :: dX(4), B + real(pr) :: Xnew(4) + + integer :: i +! + i = ncomp + + dX = 1 + F = 1 + z = 0 + z(i) = 1 + B = model%get_v0(z, 1._pr, 150._pr) + + its = 0 + do while((maxval(abs(dX)) > 1e-7 .and. maxval(abs(F)) > 1e-7)) + its = its+1 + call isofugacity(X, F, dF, dFdS) + if (any(isnan(F))) exit + dX = solve_system(dF, -F) + Xnew = X + dX + X = Xnew + end do + + contains + subroutine isofugacity(X, F, dF, dFdS) + real(pr), intent(inout) :: X(4) + real(pr), intent(out) :: F(4) + real(pr), intent(out) :: dF(4,4) + real(pr), intent(out) :: dFdS(4) + + F = 0 + dF = 0 + + Vz = exp(X(1)) + Vy = exp(X(2)) + !lnP = X(3) + T = exp(X(4)) + + call model%lnfug_vt(z, V=Vz, T=T, P=Pz, lnf=lnfug_z, dlnfdV=dlnfdv_z, dlnfdT=dlnfdT_z, dPdV=dPdVz, dPdT=dPdTz) + call model%lnfug_vt(z, V=Vy, T=T, P=Py, lnf=lnfug_y, dlnfdV=dlnfdv_y, dlnfdT=dlnfdT_y, dPdV=dPdVy, dPdT=dPdTy) + + F(1) = lnfug_z(i) - lnfug_y(i) + F(2) = log(Pz/Py) + F(3) = X(3) - log(Pz) + + if (ns == 1 .or. ns == 2) then + F(4) = log(Vz/Vy) - S! X(ns) - S + else + F(4) = X(ns) - S + end if + + dF = 0 + dF(1, 1) = Vz * dlnfdv_z(i) + dF(1, 2) = -Vy * dlnfdv_y(i) + dF(1, 3) = 0 + dF(1, 4) = T * (dlnfdT_z(i) - dlnfdT_y(i)) + + dF(2, 1) = Vz/Pz * dPdVz + dF(2, 2) = -Vy/Py * dPdVy + dF(2, 4) = T * (dPdTz/Pz - dPdTy/Py) + + dF(3, 1) = -Vz/Pz * dPdVz + dF(3, 2) = 0 + dF(3, 3) = 1 + dF(3, 4) = -T/Pz * dPdTz + + if (ns == 1 .or. ns == 2) then + dF(4, 1) = 1 + dF(4, 2) = -1 + else + dF(4, ns) = 1 + end if + + dFdS = 0 + dFdS(4) = -1 + end subroutine isofugacity + end subroutine solve_point + + real(pr) function get_T(pt, P) result(T) + !! # Get temperature + !! + !! Get the saturation temperature for a given pressure. + !! + !! ## Description + !! This function returns the saturation temperature for a given pressure. + !! The function uses an interpolator to get the required value. + !! + !! ## Examples + !! ```fortran + !! T = pt%get_T(P) + !! ``` + class(PurePsat), intent(in out) :: pt + real(pr), intent(in) :: P + call pt%interpolator_get_T%evaluate(P, T) + end function get_T + + real(pr) function get_P(pt, T) result(P) + !! # Get pressure + !! + !! Get the saturation pressure for a given temperature. + !! + !! ## Description + !! This function returns the saturation pressure for a given temperature. + !! The function uses an interpolator to get the required value. + !! + !! ## Examples + !! ```fortran + !! P = pt%get_P(T) + !! ``` + class(PurePsat), intent(in out) :: pt + real(pr), intent(in) :: T + call pt%interpolator_get_P%evaluate(T, P) + end function get_P +end module yaeos__equilibria_boundaries_pure_saturation diff --git a/src/equilibria/critical.f90 b/src/equilibria/critical.f90 index bbfa7f732..97ef6786c 100644 --- a/src/equilibria/critical.f90 +++ b/src/equilibria/critical.f90 @@ -43,6 +43,8 @@ module yaeos__equilibria_critical real(pr), allocatable :: P(:) !! Pressure [bar] real(pr), allocatable :: V(:) !! Volume [L/mol] real(pr), allocatable :: T(:) !! Temperature [K] + integer, allocatable :: ns(:) !! Specified variable + integer, allocatable :: iters(:) !! Iterations needed for this point end type CriticalLine type, private :: CPSpecs @@ -117,7 +119,7 @@ type(CriticalLine) function critical_line(& T = sum(model%components%Tc * z) P = sum(model%components%Pc * z) - call model%volume(n=z, P=P, T=T, V=V, root_type="stable") + call model%volume(n=z, P=P, T=T, V=V, root_type="vapor") X0 = [a0, log([v, T, P])] @@ -129,6 +131,7 @@ type(CriticalLine) function critical_line(& ! ======================================================================== ! Calculate the points ! ------------------------------------------------------------------------ + allocate(critical_line%ns(0), critical_line%iters(0)) XS = continuation(& f=foo, X0=X0, ns0=ns, S0=X0(ns), & dS0=dS0, max_points=npoints, solver_tol=1e-5_pr, & @@ -192,6 +195,9 @@ subroutine update_specification(X, ns, S, dS, dXdS, iterations) real(pr), intent(in out) :: dXdS(:) !! \(\frac{dX}{dS}\) integer, intent(in) :: iterations !! Iterations needed to converge point + critical_line%ns = [critical_line%ns, ns] + critical_line%iters = [critical_line%iters, iterations] + ns = maxloc(abs(dXdS), dim=1) dS = dXdS(ns)*dS dXdS = dXdS/dXdS(ns) @@ -285,7 +291,7 @@ function F_critical(model, X, ns, S, z0, zi, u) real(pr) :: V, T, P - real(pr), parameter :: eps=1e-10_pr + real(pr), parameter :: eps=1e-5_pr V = exp(X(2)) T = exp(X(3)) @@ -315,12 +321,18 @@ function df_critical(model, X, ns, S, z0, zi, u) real(pr), intent(in) :: u(:) !! Eigen-vector real(pr) :: df_critical(4, 4) !! Jacobian of the critical point function - real(pr), parameter :: eps=1e-5_pr + real(pr) :: eps real(pr) :: dx(4), F1(4), F2(4) integer :: i + if (any(X(1)*zi + (1-X(1))*z0 > 0.99)) then + eps = 1e-3_pr + else + eps = 1e-6_pr + end if + df_critical = 0 do i=1,4 dx = 0 @@ -374,7 +386,6 @@ type(EquilibriumState) function critical_point(& real(pr) :: X(4) integer :: ns real(pr) :: F(4), df(4, 4), dX(4), u(size(z0)) - real(pr) :: V, T, P real(pr) :: z(size(z0)), u_new(size(z0)), l integer :: i @@ -414,8 +425,6 @@ type(EquilibriumState) function critical_point(& if (present(V0)) then X(2) = log(V0) else - print *, exp(X(2)) - print *, exp(X(3)) call model%volume(n=z, P=exp(X(4)), T=exp(X(3)), V=X(2), root_type="stable") X(2) = log(X(2)) @@ -436,7 +445,7 @@ type(EquilibriumState) function critical_point(& dX = dX/10 end do - if (maxval(abs(F)) < 1e-5) exit + if (maxval(abs(F)) < 1e-6) exit X = X + dX l = lambda1(model, X, 0.0_pr, z0, zi, u, u_new) diff --git a/src/equilibria/equilibria.f90 b/src/equilibria/equilibria.f90 index d4f850fd0..1dac97b1d 100644 --- a/src/equilibria/equilibria.f90 +++ b/src/equilibria/equilibria.f90 @@ -7,9 +7,6 @@ module yaeos__equilibria ! Equilibrium State definitions use yaeos__equilibria_equilibrium_state, only: EquilibriumState - ! Pure component saturation pressure - use yaeos__equilibria_pure_psat, only: Psat - ! Phase split calculations use yaeos__equilibria_flash, only: flash @@ -22,12 +19,17 @@ module yaeos__equilibria critical_line, CriticalLine, critical_point, spec_CP ! Phase equilibria boundaries - use yaeos__equilibria_boundaries_phase_envelopes_pt, only:& + use yaeos__equilibria_boundaries_pure_saturation, only: & + PurePsat, pure_saturation_line + + use yaeos__equilibria_boundaries_phase_envelopes_pt, only: & PTEnvel2, pt_envelope_2ph, find_hpl - use yaeos__equilibria_boundaries_phase_envelopes_px, only:& + + use yaeos__equilibria_boundaries_phase_envelopes_px, only: & PXEnvel2, px_envelope_2ph + use yaeos__equilibria_boundaries_phase_envelopes_tx, only: & + TXEnvel2, tx_envelope_2ph ! Extra use yaeos__equilibria_auxiliar, only: k_wilson, p_wilson - implicit none end module yaeos__equilibria diff --git a/src/equilibria/pure_psat.f90 b/src/equilibria/pure_psat.f90 deleted file mode 100644 index 9d30f6631..000000000 --- a/src/equilibria/pure_psat.f90 +++ /dev/null @@ -1,44 +0,0 @@ -module yaeos__equilibria_pure_psat - !! Module used to calculate the saturation pressure of pure components at - !! a given temperature. - use yaeos__constants, only: pr - use yaeos__models, only: ArModel, size -contains - real(pr) function Psat(eos, ncomp, T) - !! Calculation of saturation pressure of a pure component using the - !! secant method. - class(ArModel), intent(in) :: eos !! Model that will be used - integer, intent(in) :: ncomp - !! Number of component in the mixture from which the saturation pressure - !! will be calculated - real(pr), intent(in) :: T !! Temperature [K] - - real(pr) :: P1, P2 - real(pr) :: f1, f2 - - real(pr) :: n(size(eos)) - - n = 0 - n(ncomp) = 1 - - P1 = 0.5 - P2 = 1 - - do while(abs(diff(P2)) > 1e-5) - f1 = diff(P1) - f2 = diff(P2) - Psat = (P1 * f2 - P2 * f1)/(f2 - f1) - P1 = P2 - P2 = Psat - end do - contains - real(pr) function diff(P) - real(pr), intent(in) :: P - real(pr) :: V_l, V_v - real(pr) :: phi_v(size(eos)), phi_l(size(eos)) - call eos%lnphi_pt(n, P=P, T=T, V=V_v, lnPhi=phi_v, root_type="vapor") - call eos%lnphi_pt(n, P=P, T=T, V=V_l, lnPhi=phi_l, root_type="liquid") - diff = phi_v(ncomp) - phi_l(ncomp) - end function - end function Psat -end module \ No newline at end of file diff --git a/src/equilibria/saturations_points.f90 b/src/equilibria/saturations_points.f90 index cea03ea97..6df22a0e9 100644 --- a/src/equilibria/saturations_points.f90 +++ b/src/equilibria/saturations_points.f90 @@ -255,7 +255,7 @@ type(EquilibriumState) function saturation_temperature(model, n, p, kind, t0, y0 k = exp(lnfug_z - lnfug_y) f = sum(z*k) - 1 - step = f/sum(z * k * (dlnphi_dt_z - dlnphi_dt_y)) + step = f/sum(T * z * k * (dlnphi_dt_z - dlnphi_dt_y)) if (.not. ieee_is_finite(step) .or. ieee_is_nan(step)) exit diff --git a/src/math/continuation.f90 b/src/math/continuation.f90 index 9dea31078..b43edb4e9 100644 --- a/src/math/continuation.f90 +++ b/src/math/continuation.f90 @@ -10,7 +10,7 @@ module yaeos__math_continuation integer :: ns real(pr) :: S real(pr) :: dS - end type + end type ContinuationVariable abstract interface subroutine continuation_function(X, ns, S, F, dF, dFdS) diff --git a/src/models/excess_gibbs/ge_models.f90 b/src/models/excess_gibbs/ge_models.f90 index abcb43835..7dff0c597 100644 --- a/src/models/excess_gibbs/ge_models.f90 +++ b/src/models/excess_gibbs/ge_models.f90 @@ -9,35 +9,117 @@ module yaeos__models_ge contains procedure(excess_gibbs), deferred :: excess_gibbs procedure :: ln_activity_coefficient => ln_activity_coefficient + procedure :: excess_enthalpy => excess_enthalpy + procedure :: excess_entropy => excess_entropy end type abstract interface - subroutine excess_gibbs(self, n, t, Ge, GeT, GeT2, Gen, GeTn, Gen2) - !! Excess Gibbs and derivs procedure + subroutine excess_gibbs(self, n, T, Ge, GeT, GeT2, Gen, GeTn, Gen2) + !! Calculate Excess Gibbs and its derivatives. + !! import pr, GeModel class(GeModel), intent(in) :: self !! Model real(pr), intent(in) ::n(:) !! Moles vector - real(pr), intent(in) :: t !! Temperature [K] - real(pr), optional, intent(out) :: Ge !! Excess Gibbs + real(pr), intent(in) :: T !! Temperature [K] + real(pr), optional, intent(out) :: Ge !! Excess Gibbs free energy real(pr), optional, intent(out) :: GeT !! \(\frac{dG^E}{dT}\) real(pr), optional, intent(out) :: GeT2 !! \(\frac{d^2G^E}{dT^2}\) - real(pr), optional, intent(out) :: Gen(size(n)) + real(pr), optional, intent(out) :: Gen(size(n)) !! \(\frac{dG^E}{dn}\) real(pr), optional, intent(out) :: GeTn(size(n)) + !! \(\frac{d^2G^E}{dTdn}\) real(pr), optional, intent(out) :: Gen2(size(n), size(n)) + !! \(\frac{d^2G^E}{dn^2}\) end subroutine end interface contains - subroutine ln_activity_coefficient(self, n, T, lngamma) - class(GeModel), intent(in) :: self - real(pr), intent(in) :: n(:) - real(pr), intent(in) :: T - real(pr), intent(out) :: lngamma(:) + subroutine ln_activity_coefficient(self, n, T, lngamma, dlngammadT, dlngammadn) + !! Calculate natural logarithm of activity coefficients. + !! + !! \[ + !! \ln \gamma_i = \frac{1}{RT} \frac{\partial G^E}{\partial n_i} + !! \] + !! + class(GeModel), intent(in) :: self !! Model + real(pr), intent(in) :: n(:) !! Moles vector + real(pr), intent(in) :: T !! Temperature [K] + real(pr), optional, intent(out) :: lngamma(:) + !! Natural logarithm of activity coefficients + real(pr), optional, intent(out) :: dlngammadT(size(n)) + !! \(\frac{d\ln \gamma_i}{dT}\) + real(pr), optional, intent(out) :: dlngammadn(size(n),size(n)) + !! \(\frac{d\ln \gamma_i}{dn_j}\) - real(pr) :: ge, dgedn(size(n)) + real(pr) :: Ge, Gen(size(n)), GeTn(size(n)), Gen2(size(n), size(n)) - call self%excess_gibbs(n, t, ge=ge, gen=dgedn) - lngamma = dgedn/(R*T) + logical :: tt, dt, dn + + tt = present(lngamma) + dt = present(dlngammadT) + dn = present(dlngammadn) + + if (tt .and. .not. dt .and. .not. dn) then + call self%excess_gibbs(n, T, Ge=Ge, Gen=Gen) + else if (.not. dn) then + call self%excess_gibbs(n, T, Ge=Ge, Gen=Gen, GeTn=GeTn) + else + call self%excess_gibbs(n, T, Ge=Ge, Gen=Gen, GeTn=GeTn, Gen2=Gen2) + end if + + if (tt) lngamma = Gen / (R * T) + if (dt) dlngammadT = (GeTn - Gen / T) / (R * T) + if (dn) dlngammadn = Gen2 / (R * T) end subroutine + + subroutine excess_enthalpy(self, n, T, He, HeT, Hen) + !! Calculate Excess enthalpy and its derivatives. + !! + !! \[ + !! H^E = G^E - T \frac{\partial G^E}{\partial T} + !! \] + !! + !! ## References + !! [1] https://en.wikipedia.org/wiki/Gibbs%E2%80%93Helmholtz_equation + !! + class(GeModel), intent(in) :: self !! Model + real(pr), intent(in) :: n(:) !! Moles vector + real(pr), intent(in) :: T !! Temperature [K] + real(pr), optional, intent(out) :: He !! Excess enthalpy + real(pr), optional, intent(out) :: HeT !! \(\frac{dH^E}{dT}\) + real(pr), optional, intent(out) :: Hen(:) !! \(\frac{dH^E}{dn}\) + + real(pr) :: Ge, GeT, GeT2, Gen(size(n)), GeTn(size(n)) + + call self%excess_gibbs(& + n, T, Ge=Ge, GeT=GeT, GeT2=GeT2, Gen=Gen, GeTn=GeTn & + ) + + if (present(He)) He = Ge - T*GeT + if (present(HeT)) HeT = -T * GeT2 + if (present(Hen)) Hen = Gen - T*GeTn + end subroutine excess_enthalpy + + subroutine excess_entropy(self, n, T, Se, SeT, Sen) + !! Calculate Excess entropy and its derivatives. + !! + !! \[ + !! S^E = \frac{H^E - G^E}{T} + !! \] + !! + class(GeModel), intent(in) :: self !! Model + real(pr), intent(in) :: n(:) !! Moles vector + real(pr), intent(in) :: T !! Temperature [K] + real(pr), optional, intent(out) :: Se !! Excess entropy + real(pr), optional, intent(out) :: SeT !! \(\frac{dS^E}{dT}\) + real(pr), optional, intent(out) :: Sen(:) !! \(\frac{dS^E}{dn}\) + + real(pr) :: Ge, GeT, GeT2, GeTn(size(n)) + + call self%excess_gibbs(n, T, Ge=Ge, GeT=GeT, GeT2=GeT2, GeTn=GeTn) + + if (present(Se)) Se = -GeT + if (present(SeT)) SeT = -GeT2 + if (present(Sen)) Sen = -GeTn + end subroutine excess_entropy end module diff --git a/src/models/models.f90 b/src/models/models.f90 index f91ece15a..c761cc32a 100644 --- a/src/models/models.f90 +++ b/src/models/models.f90 @@ -12,14 +12,15 @@ module yaeos__models !! should provide. !! - **Cubic Equations of state**: !! - `AlphaFunction` type - !! - `CubicMixRule` type !! - `CubicEos` type that extends `ArModel` to use a generic !! two-parameter EoS. Implemented models that use this type can be !! seen at [[yaeos__models_ar_cubic_implementations(module)]] - !! - `QMR` (Quadratic Mixing Rule) type: extensible derived type that + !! - `QMR` (Quadratic Mixing Rule) type: extensible derived type that !! defaults to classic vdW mixing rules. !! - `MHV` (Modified Huron-Vidal) type: Michelsens first order modified !! Huron-Vidal mixing rule. + !! - **GERG2008 Equation of State**: + !! - GERG2008 multifluid equation of state ! Base model structure use yaeos__models_base, only: BaseModel @@ -27,6 +28,10 @@ module yaeos__models ! Residual Helmholtz Models use yaeos__models_ar, only: ArModel, size + ! GERG2008 + use yaeos__models_ar_gerg2008, only: & + Gerg2008, Gerg2008Binary, G2008Components, gerg_2008 + ! Cubic EoS models use yaeos__models_ar_genericcubic, only: & CubicEoS, GenericCubic_Ar, AlphaFunction, CubicMixRule @@ -47,4 +52,4 @@ module yaeos__models ! Implemented models use yaeos__models_ge_implementations -end module +end module yaeos__models diff --git a/src/models/residual_helmholtz/ar_models.f90 b/src/models/residual_helmholtz/ar_models.f90 index b0db88214..0f5187912 100644 --- a/src/models/residual_helmholtz/ar_models.f90 +++ b/src/models/residual_helmholtz/ar_models.f90 @@ -59,6 +59,7 @@ module yaeos__models_ar procedure :: entropy_residual_vt procedure :: Cv_residual_vt procedure :: Cp_residual_vt + procedure :: Psat_pure end type ArModel interface size @@ -429,7 +430,7 @@ subroutine lnfug_vt(eos, & RT = R*T if (present(lnf) .and. .not. (& - present(dlnfdn) & + present(dlnfdn) & .or. present(dlnfdV) & .or. present(dlnfdT) & )) then @@ -440,7 +441,7 @@ subroutine lnfug_vt(eos, & where (n /= 0) lnf = log(n/totn) + Arn/RT - log(V/(totn*RT)) endwhere - + if (present(P)) P = P_in return @@ -471,7 +472,7 @@ subroutine lnfug_vt(eos, & end if if (present(dlnfdV)) then - dlnfdV = -dPdn_in/RT + dlnfdV = -dPdn_in/RT end if if (present(dlnfdT)) then @@ -605,4 +606,42 @@ subroutine Cp_residual_vt(eos, n, V, T, Cp) Cp = Cv - T*dPdT**2/dPdV - totn*R end subroutine Cp_residual_vt + + real(pr) function Psat_pure(eos, ncomp, T) + !! Calculation of saturation pressure of a pure component using the + !! secant method. + class(ArModel), intent(in) :: eos !! Model that will be used + integer, intent(in) :: ncomp + !! Number of component in the mixture from which the saturation pressure + !! will be calculated + real(pr), intent(in) :: T !! Temperature [K] + + real(pr) :: P1, P2 + real(pr) :: f1, f2 + + real(pr) :: n(size(eos)) + + n = 0 + n(ncomp) = 1 + + P1 = 0.5 + P2 = 1 + + do while(abs(diff(P2)) > 1e-5) + f1 = diff(P1) + f2 = diff(P2) + Psat_pure = (P1 * f2 - P2 * f1)/(f2 - f1) + P1 = P2 + P2 = Psat_pure + end do + contains + real(pr) function diff(P) + real(pr), intent(in) :: P + real(pr) :: V_l, V_v + real(pr) :: phi_v(size(eos)), phi_l(size(eos)) + call eos%lnphi_pt(n, P=P, T=T, V=V_v, lnPhi=phi_v, root_type="vapor") + call eos%lnphi_pt(n, P=P, T=T, V=V_l, lnPhi=phi_l, root_type="liquid") + diff = phi_v(ncomp) - phi_l(ncomp) + end function diff + end function Psat_pure end module yaeos__models_ar diff --git a/src/models/residual_helmholtz/cubic/implementations/implementations.f90 b/src/models/residual_helmholtz/cubic/implementations/implementations.f90 index 52414d449..e4d614e7c 100644 --- a/src/models/residual_helmholtz/cubic/implementations/implementations.f90 +++ b/src/models/residual_helmholtz/cubic/implementations/implementations.f90 @@ -2,6 +2,7 @@ module yaeos__models_ar_cubic_implementations use yaeos__constants, only: pr, R use yaeos__models_ar_genericcubic, only: CubicEoS use yaeos__substance, only: Substances + implicit none !! Implemented Cubic Equations of State. !! !! - PengRobinson76 @@ -19,370 +20,384 @@ module yaeos__models_ar_cubic_implementations contains - type(CubicEoS) function PengRobinson76(tc, pc, w, kij, lij) result(model) - !! PengRobinson76. - !! - !! Using the critical constants setup the parameters to use the - !! PengRobinson Equation of State - !! - !! - \[\alpha(T_r) = (1 + k (1 - \sqrt{T_r}))^2\] - !! - \[k = 0.37464 + 1.54226 * \omega - 0.26993 \omega^2 \] - !! - \[a_c = 0.45723553 R^2 T_c^2 / P_c\] - !! - \[b = 0.07779607r R T_c/P_c\] - !! - \[\delta_1 = 1 + \sqrt{2}\] - !! - \[\delta_2 = 1 - \sqrt{2}\] - !! - !! There is also the optional posibility to include the \(k_{ij}\) and - !! \(l_{ij}\) matrices. Using by default Classic Van der Waals mixing - !! rules. - !! - !! After setting up the model, it is possible to redefine either the - !! mixing rule or the alpha function using a different derived type - !! defined outside the function. - use yaeos__constants, only: pr, R - use yaeos__substance, only: Substances - use yaeos__models_ar_genericcubic, only: CubicEoS - use yaeos__models_ar_cubic_alphas, only: AlphaSoave - use yaeos__models_ar_cubic_quadratic_mixing, only: QMR - real(pr), intent(in) :: tc(:) !! Critical Temperatures [K] - real(pr), intent(in) :: pc(:) !! Critical Pressures [bar] - real(pr), intent(in) :: w(:) !! Acentric Factors - real(pr), optional, intent(in) :: kij(:, :) !! \(k_{ij}\) matrix - real(pr), optional, intent(in) :: lij(:, :) !! \(l_{ij}\) matrix - - type(Substances) :: composition - type(QMR) :: mixrule - type(AlphaSoave) :: alpha - integer :: nc - integer :: i - - nc = size(tc) - - composition%tc = tc - composition%pc = pc - composition%w = w - - alpha%k = 0.37464_pr & - + 1.54226_pr * composition%w & - - 0.26993_pr * composition%w**2 - - if (present(kij)) then - mixrule%k = kij - else - mixrule%k = reshape([(0, i=1,nc**2)], [nc, nc]) - endif - - if (present(lij)) then - mixrule%l = lij - else - mixrule%l = reshape([(0, i=1,nc**2)], [nc, nc]) - endif - - model%components = composition - model%ac = 0.45723553_pr * R**2 * composition%tc**2 / composition%pc - model%b = 0.07779607_pr * R * composition%tc/composition%pc - model%del1 = [(1 + sqrt(2.0_pr), i=1,nc)] - model%del2 = [(1 - sqrt(2.0_pr), i=1,nc)] - model%alpha = alpha - model%mixrule = mixrule - model%name = "PR76" - end function - - type(CubicEoS) function PengRobinson78(tc, pc, w, kij, lij) result(model) - !! PengRobinson78. - !! - !! Using the critical constants setup the parameters to use the - !! PengRobinson Equation of State - !! - !! - \[\alpha(T_r) = (1 + k (1 - \sqrt{T_r}))^2\] - !! - \[k = 0.37464 + 1.54226 \omega - 0.26992 \omega^2 \text{ where } \omega <=0.491\] - !! - \[k = 0.37464 + 1.48503 \omega - 0.16442 \omega^2 + 0.016666 \omega^3 \text{ where } \omega > 0.491\] - !! - \[a_c = 0.45723553 R^2 T_c^2 / P_c\] - !! - \[b = 0.07779607r R T_c/P_c\] - !! - \[\delta_1 = 1 + \sqrt{2}\] - !! - \[\delta_2 = 1 - \sqrt{2}\] - !! - !! There is also the optional posibility to include the \(k_{ij}\) and - !! \(l_{ij}\) matrices. Using by default Classic Van der Waals mixing - !! rules. - !! - !! After setting up the model, it is possible to redefine either the - !! mixing rule or the alpha function using a different derived type - !! defined outside the function. - use yaeos__constants, only: pr, R - use yaeos__substance, only: Substances - use yaeos__models_ar_genericcubic, only: CubicEoS - use yaeos__models_ar_cubic_alphas, only: AlphaSoave - use yaeos__models_ar_cubic_quadratic_mixing, only: QMR - real(pr), intent(in) :: tc(:) !! Critical Temperatures [K] - real(pr), intent(in) :: pc(:) !! Critical Pressures [bar] - real(pr), intent(in) :: w(:) !! Acentric Factors - real(pr), optional, intent(in) :: kij(:, :) !! \(k_{ij}\) matrix - real(pr), optional, intent(in) :: lij(:, :) !! \(l_{ij}\) matrix - - type(Substances) :: composition - type(QMR) :: mixrule - type(AlphaSoave) :: alpha - integer :: nc - integer :: i - - nc = size(tc) - - composition%tc = tc - composition%pc = pc - composition%w = w - - allocate(alpha%k(nc)) - where (composition%w <=0.491) - alpha%k = 0.37464 + 1.54226 * composition%w - 0.26992 * composition%w**2 - elsewhere - alpha%k = 0.379642 + 1.48503 * composition%w - 0.164423 * composition%w**2 + 0.016666 * composition%w**3 - end where - - if (present(kij)) then - mixrule%k = kij - else - mixrule%k = reshape([(0, i=1,nc**2)], [nc, nc]) - endif - - if (present(lij)) then - mixrule%l = lij - else - mixrule%l = reshape([(0, i=1,nc**2)], [nc, nc]) - endif - - model%components = composition - model%ac = 0.45723553_pr * R**2 * composition%tc**2 / composition%pc - model%b = 0.07779607_pr * R * composition%tc/composition%pc - model%del1 = [(1 + sqrt(2.0_pr), i=1,nc)] - model%del2 = [(1 - sqrt(2.0_pr), i=1,nc)] - model%alpha = alpha - model%mixrule = mixrule - model%name = "PR78" - end function - - type(CubicEoS) function SoaveRedlichKwong(tc, pc, w, kij, lij) result(model) - !! SoaveRedlichKwong. - !! - !! Using the critical constants setup the parameters to use the - !! SoaveRedlichKwong Equation of State - !! - !! - \[\alpha(T_r) = (1 + k (1 - \sqrt{T_r}))^2\] - !! - \[k = 0.48 + 1.574 \omega - 0.175 \omega^2 \] - !! - \[a_c = 0.427480 R^2 * T_c^2/P_c\] - !! - \[b = 0.086640 R T_c/P_c\] - !! - \[\delta_1 = 1\] - !! - \[\delta_2 = 0\] - !! - !! There is also the optional posibility to include the k_{ij} and l_{ij} - !! matrices. Using by default Classic Van der Waals mixing rules. - !! - !! After setting up the model, it is possible to redefine either the - !! mixing rule or the alpha function using a different derived type - !! defined outside the function. - use yaeos__models_ar_genericcubic, only: CubicEoS - use yaeos__models_ar_cubic_alphas, only: AlphaSoave - use yaeos__models_ar_cubic_quadratic_mixing, only: QMR - real(pr), intent(in) :: tc(:) !! Critical temperature [K] - real(pr), intent(in) :: pc(:) !! Critical pressure [bar] - real(pr), intent(in) :: w(:) !! Acentric factor - real(pr), optional, intent(in) :: kij(:, :) !! \(k_{ij}\) matrix - real(pr), optional, intent(in) :: lij(:, :) !! \(l_{ij}\) matrix - - type(Substances) :: composition - type(QMR) :: mixrule - type(AlphaSoave) :: alpha - integer :: nc - integer :: i - - nc = size(tc) - - composition%tc = tc - composition%pc = pc - composition%w = w - - alpha%k = 0.48_pr + 1.574_pr * composition%w - 0.175_pr * composition%w**2 - - if (present(kij)) then - mixrule%k = kij - else - mixrule%k = reshape([(0, i=1,nc**2)], [nc, nc]) - endif - - if (present(lij)) then - mixrule%l = lij - else - mixrule%l = reshape([(0, i=1,nc**2)], [nc, nc]) - endif - - model%components = composition - model%ac = 0.427480_pr * R**2 * composition%tc**2/composition%pc - model%b = 0.086640_pr * R * composition%tc/composition%pc - model%del1 = [(1, i=1,nc)] - model%del2 = [(0, i=1,nc)] - model%alpha = alpha - model%mixrule = mixrule - model%name = "SRK" - end function - - type(CubicEoS) function PSRK(tc, pc, w, molecules, c1, c2, c3) result(model) - use yaeos__models_ar_genericcubic, only: CubicEoS - use yaeos__models_ar_cubic_alphas, only: AlphaMathiasCopeman, AlphaSoave - use yaeos__models_cubic_mixing_rules_huron_vidal, only: MHV - use yaeos__models_ge_implementations, only: setup_psrk, UNIFAC - use yaeos__models_ge_group_contribution_groups, only: Groups - real(pr), intent(in) :: tc(:) !! Critical temperature [K] - real(pr), intent(in) :: pc(:) !! Critical pressure [bar] - real(pr), intent(in) :: w(:) !! Acentric factor - type(Groups), intent(in) :: molecules(:) - real(pr), optional, intent(in) :: c1(:), c2(:), c3(:) - - type(UNIFAC) :: ge - type(Substances) :: composition - type(MHV) :: mixrule - type(AlphaSoave) :: alpha - type(AlphaMathiasCopeman) :: alpha_mc - integer :: nc - integer :: i - - nc = size(tc) - - composition%tc = tc - composition%pc = pc - composition%w = w - - ge = setup_psrk(molecules) - - if (present(c1) .and. present(c2) .and. present(c3)) then - alpha_mc = AlphaMathiasCopeman(c1, c2, c3) - model%alpha = alpha_mc - else - alpha%k = 0.48_pr + 1.574_pr * composition%w - 0.175_pr * composition%w**2 - model%alpha = alpha - end if - - model%components = composition - model%ac = 0.427480_pr * R**2 * composition%tc**2/composition%pc - model%b = 0.086640_pr * R * composition%tc/composition%pc - model%del1 = [(1, i=1,nc)] - model%del2 = [(0, i=1,nc)] - - mixrule = MHV(ge=ge, b=model%b, q=-0.64663_pr) - model%mixrule = mixrule - - model%name = "PSRK" - end function - - type(CubicEoS) function RKPR(tc, pc, w, zc, kij, lij, delta_1, k) result(model) - !! RKPR Equation of State - !! - !! The RKPR EoS extends the classical formulation of Cubic Equations - !! of State by freeing the parameter \(\delta_1\). This extra degree - !! provides extra ways of implementing the equation in comparison - !! of other Cubic EoS (like PR and SRK) which are limited to definition - !! of their critical constants. - !! - !! Besides that extra parameter, the RKRR includes another \(\alpha\) - !! function: - !! \[ - !! \alpha(T_r) = \left(\frac{3}{2+T_r}\right)^k - !! \] - !! - !! In this implementation we take the simplest form which correlates - !! the extra parameter to the critical compressibility factor \(Z_c\) and - !! the \(k\) parameter of the \(\alpha\) function to \(Z_c\) and \(\omega\): - !! - !! \[\delta_1 = d_1 + d_2 (d_3 - Z_c)^d_4 + d_5 (d_3 - Z_c) ^ d_6\] - !! \[k = (A_1 Z_c + A_0)\omega^2 + (B_1 Z_c + B_0)\omega + (C_1 Z_c + C_0)\] - - use yaeos__models_ar_cubic_quadratic_mixing, only: QMR_RKPR - use yaeos__models_ar_cubic_alphas, only: AlphaRKPR - real(pr), intent(in) :: tc(:) !! Critical Temperature [K] - real(pr), intent(in) :: pc(:) !! Critical Pressure [bar] - real(pr), intent(in) :: w(:) !! Acentric Factor - real(pr), intent(in) :: zc(:) !! Critical compressibility - real(pr), optional, intent(in) :: kij(:, :) !! k_{ij} matrix - real(pr), optional, intent(in) :: lij(:, :) !! l_{ij} matrix - real(pr), optional, intent(in) :: delta_1(:) - real(pr), optional, intent(in) :: k(:) - - type(AlphaRKPR) :: alpha - type(QMR_RKPR) :: mixrule - type(Substances) :: composition - - integer :: i, nc - - real(pr), parameter :: d1 = 0.428364, & - d2 = 18.496215, & - d3=0.338426, & - d4=0.66, & - d5 = 789.723105, & - d6=2.512392 - - real(pr), parameter :: A1 = -2.4407 - real(pr), parameter :: A0 = 0.0017 - real(pr), parameter :: B1 =7.4513 - real(pr), parameter :: B0 =1.9681 - real(pr), parameter :: C1 =12.504 - real(pr), parameter :: C0 =-2.6238 - - real(pr) :: OMa(size(pc)), OMb(size(pc)) - real(pr) :: Zc_eos(size(pc)) - - nc = size(tc) - - composition%pc = pc - composition%tc = tc - composition%w = w - - Zc_eos = 1.168 * Zc - - if (present(k)) then + type(CubicEoS) function PengRobinson76(tc, pc, w, kij, lij) result(model) + !! PengRobinson76. + !! + !! Using the critical constants setup the parameters to use the + !! PengRobinson Equation of State + !! + !! - \[\alpha(T_r) = (1 + k (1 - \sqrt{T_r}))^2\] + !! - \[k = 0.37464 + 1.54226 * \omega - 0.26993 \omega^2 \] + !! - \[a_c = 0.45723553 R^2 T_c^2 / P_c\] + !! - \[b = 0.07779607r R T_c/P_c\] + !! - \[\delta_1 = 1 + \sqrt{2}\] + !! - \[\delta_2 = 1 - \sqrt{2}\] + !! + !! There is also the optional posibility to include the \(k_{ij}\) and + !! \(l_{ij}\) matrices. Using by default Classic Van der Waals mixing + !! rules. + !! + !! After setting up the model, it is possible to redefine either the + !! mixing rule or the alpha function using a different derived type + !! defined outside the function. + use yaeos__constants, only: pr, R + use yaeos__substance, only: Substances + use yaeos__models_ar_genericcubic, only: CubicEoS + use yaeos__models_ar_cubic_alphas, only: AlphaSoave + use yaeos__models_ar_cubic_quadratic_mixing, only: QMR + real(pr), intent(in) :: tc(:) !! Critical Temperatures [K] + real(pr), intent(in) :: pc(:) !! Critical Pressures [bar] + real(pr), intent(in) :: w(:) !! Acentric Factors + real(pr), optional, intent(in) :: kij(:, :) !! \(k_{ij}\) matrix + real(pr), optional, intent(in) :: lij(:, :) !! \(l_{ij}\) matrix + + type(Substances) :: composition + type(QMR) :: mixrule + type(AlphaSoave) :: alpha + integer :: nc + integer :: i + + nc = size(tc) + + composition%tc = tc + composition%pc = pc + composition%w = w + + alpha%k = 0.37464_pr & + + 1.54226_pr * composition%w & + - 0.26993_pr * composition%w**2 + + if (present(kij)) then + mixrule%k = kij + else + mixrule%k = reshape([(0, i=1,nc**2)], [nc, nc]) + endif + + if (present(lij)) then + mixrule%l = lij + else + mixrule%l = reshape([(0, i=1,nc**2)], [nc, nc]) + endif + + model%components = composition + model%ac = 0.45723553_pr * R**2 * composition%tc**2 / composition%pc + model%b = 0.07779607_pr * R * composition%tc/composition%pc + model%del1 = [(1 + sqrt(2.0_pr), i=1,nc)] + model%del2 = [(1 - sqrt(2.0_pr), i=1,nc)] + model%alpha = alpha + model%mixrule = mixrule + model%name = "PR76" + end function PengRobinson76 + + type(CubicEoS) function PengRobinson78(tc, pc, w, kij, lij) result(model) + !! PengRobinson78. + !! + !! Using the critical constants setup the parameters to use the + !! PengRobinson Equation of State + !! + !! - \[\alpha(T_r) = (1 + k (1 - \sqrt{T_r}))^2\] + !! - \[k = 0.37464 + 1.54226 \omega - 0.26992 \omega^2 \text{ where } \omega <=0.491\] + !! - \[k = 0.37464 + 1.48503 \omega - 0.16442 \omega^2 + 0.016666 \omega^3 \text{ where } \omega > 0.491\] + !! - \[a_c = 0.45723553 R^2 T_c^2 / P_c\] + !! - \[b = 0.07779607r R T_c/P_c\] + !! - \[\delta_1 = 1 + \sqrt{2}\] + !! - \[\delta_2 = 1 - \sqrt{2}\] + !! + !! There is also the optional posibility to include the \(k_{ij}\) and + !! \(l_{ij}\) matrices. Using by default Classic Van der Waals mixing + !! rules. + !! + !! After setting up the model, it is possible to redefine either the + !! mixing rule or the alpha function using a different derived type + !! defined outside the function. + use yaeos__constants, only: pr, R + use yaeos__substance, only: Substances + use yaeos__models_ar_genericcubic, only: CubicEoS + use yaeos__models_ar_cubic_alphas, only: AlphaSoave + use yaeos__models_ar_cubic_quadratic_mixing, only: QMR + real(pr), intent(in) :: tc(:) !! Critical Temperatures [K] + real(pr), intent(in) :: pc(:) !! Critical Pressures [bar] + real(pr), intent(in) :: w(:) !! Acentric Factors + real(pr), optional, intent(in) :: kij(:, :) !! \(k_{ij}\) matrix + real(pr), optional, intent(in) :: lij(:, :) !! \(l_{ij}\) matrix + + type(Substances) :: composition + type(QMR) :: mixrule + type(AlphaSoave) :: alpha + integer :: nc + integer :: i + + nc = size(tc) + + composition%tc = tc + composition%pc = pc + composition%w = w + + allocate(alpha%k(nc)) + where (composition%w <=0.491) + alpha%k = 0.37464 + 1.54226 * composition%w - 0.26992 * composition%w**2 + elsewhere + alpha%k = 0.379642 + 1.48503 * composition%w - 0.164423 * composition%w**2 + 0.016666 * composition%w**3 + end where + + if (present(kij)) then + mixrule%k = kij + else + mixrule%k = reshape([(0, i=1,nc**2)], [nc, nc]) + endif + + if (present(lij)) then + mixrule%l = lij + else + mixrule%l = reshape([(0, i=1,nc**2)], [nc, nc]) + endif + + model%components = composition + model%ac = 0.45723553_pr * R**2 * composition%tc**2 / composition%pc + model%b = 0.07779607_pr * R * composition%tc/composition%pc + model%del1 = [(1 + sqrt(2.0_pr), i=1,nc)] + model%del2 = [(1 - sqrt(2.0_pr), i=1,nc)] + model%alpha = alpha + model%mixrule = mixrule + model%name = "PR78" + end function PengRobinson78 + + type(CubicEoS) function SoaveRedlichKwong(tc, pc, w, kij, lij) result(model) + !! SoaveRedlichKwong. + !! + !! Using the critical constants setup the parameters to use the + !! SoaveRedlichKwong Equation of State + !! + !! - \[\alpha(T_r) = (1 + k (1 - \sqrt{T_r}))^2\] + !! - \[k = 0.48 + 1.574 \omega - 0.175 \omega^2 \] + !! - \[a_c = 0.427480 R^2 * T_c^2/P_c\] + !! - \[b = 0.086640 R T_c/P_c\] + !! - \[\delta_1 = 1\] + !! - \[\delta_2 = 0\] + !! + !! There is also the optional posibility to include the k_{ij} and l_{ij} + !! matrices. Using by default Classic Van der Waals mixing rules. + !! + !! After setting up the model, it is possible to redefine either the + !! mixing rule or the alpha function using a different derived type + !! defined outside the function. + use yaeos__models_ar_genericcubic, only: CubicEoS + use yaeos__models_ar_cubic_alphas, only: AlphaSoave + use yaeos__models_ar_cubic_quadratic_mixing, only: QMR + real(pr), intent(in) :: tc(:) !! Critical temperature [K] + real(pr), intent(in) :: pc(:) !! Critical pressure [bar] + real(pr), intent(in) :: w(:) !! Acentric factor + real(pr), optional, intent(in) :: kij(:, :) !! \(k_{ij}\) matrix + real(pr), optional, intent(in) :: lij(:, :) !! \(l_{ij}\) matrix + + type(Substances) :: composition + type(QMR) :: mixrule + type(AlphaSoave) :: alpha + integer :: nc + integer :: i + + nc = size(tc) + + composition%tc = tc + composition%pc = pc + composition%w = w + + alpha%k = 0.48_pr + 1.574_pr * composition%w - 0.175_pr * composition%w**2 + + if (present(kij)) then + mixrule%k = kij + else + mixrule%k = reshape([(0, i=1,nc**2)], [nc, nc]) + endif + + if (present(lij)) then + mixrule%l = lij + else + mixrule%l = reshape([(0, i=1,nc**2)], [nc, nc]) + endif + + model%components = composition + model%ac = 0.427480_pr * R**2 * composition%tc**2/composition%pc + model%b = 0.086640_pr * R * composition%tc/composition%pc + model%del1 = [(1, i=1,nc)] + model%del2 = [(0, i=1,nc)] + model%alpha = alpha + model%mixrule = mixrule + model%name = "SRK" + end function SoaveRedlichKwong + + type(CubicEoS) function PSRK(tc, pc, w, molecules, c1, c2, c3) result(model) + use yaeos__models_ar_genericcubic, only: CubicEoS + use yaeos__models_ar_cubic_alphas, only: AlphaMathiasCopeman, AlphaSoave + use yaeos__models_cubic_mixing_rules_huron_vidal, only: MHV + use yaeos__models_ge_implementations, only: setup_psrk, UNIFAC + use yaeos__models_ge_group_contribution_groups, only: Groups + real(pr), intent(in) :: tc(:) !! Critical temperature [K] + real(pr), intent(in) :: pc(:) !! Critical pressure [bar] + real(pr), intent(in) :: w(:) !! Acentric factor + type(Groups), intent(in) :: molecules(:) + real(pr), optional, intent(in) :: c1(:), c2(:), c3(:) + + type(UNIFAC) :: ge + type(Substances) :: composition + type(MHV) :: mixrule + type(AlphaSoave) :: alpha + type(AlphaMathiasCopeman) :: alpha_mc + integer :: nc + integer :: i + + nc = size(tc) + + composition%tc = tc + composition%pc = pc + composition%w = w + + ge = setup_psrk(molecules) + + if (present(c1) .and. present(c2) .and. present(c3)) then + alpha_mc = AlphaMathiasCopeman(c1, c2, c3) + model%alpha = alpha_mc + else + alpha%k = 0.48_pr + 1.574_pr * composition%w - 0.175_pr * composition%w**2 + model%alpha = alpha + end if + + model%components = composition + model%ac = 0.427480_pr * R**2 * composition%tc**2/composition%pc + model%b = 0.086640_pr * R * composition%tc/composition%pc + model%del1 = [(1, i=1,nc)] + model%del2 = [(0, i=1,nc)] + + mixrule = MHV(ge=ge, b=model%b, q=-0.64663_pr) + model%mixrule = mixrule + + model%name = "PSRK" + end function PSRK + + type(CubicEoS) function RKPR(tc, pc, w, zc, kij, lij, delta_1, k) result(model) + !! RKPR Equation of State + !! + !! The RKPR EoS extends the classical formulation of Cubic Equations + !! of State by freeing the parameter \(\delta_1\). This extra degree + !! provides extra ways of implementing the equation in comparison + !! of other Cubic EoS (like PR and SRK) which are limited to definition + !! of their critical constants. + !! + !! Besides that extra parameter, the RKRR includes another \(\alpha\) + !! function: + !! \[ + !! \alpha(T_r) = \left(\frac{3}{2+T_r}\right)^k + !! \] + !! + !! In this implementation we take the simplest form which correlates + !! the extra parameter to the critical compressibility factor \(Z_c\) and + !! the \(k\) parameter of the \(\alpha\) function to \(Z_c\) and \(\omega\): + !! + !! \[\delta_1 = d_1 + d_2 (d_3 - Z_c)^d_4 + d_5 (d_3 - Z_c) ^ d_6\] + !! \[k = (A_1 Z_c + A_0)\omega^2 + (B_1 Z_c + B_0)\omega + (C_1 Z_c + C_0)\] + use yaeos__models_ar_cubic_quadratic_mixing, only: QMR + use yaeos__models_ar_cubic_alphas, only: AlphaRKPR + real(pr), intent(in) :: tc(:) !! Critical Temperature [K] + real(pr), intent(in) :: pc(:) !! Critical Pressure [bar] + real(pr), intent(in) :: w(:) !! Acentric Factor + real(pr), intent(in) :: zc(:) !! Critical compressibility + real(pr), optional, intent(in) :: kij(:, :) !! k_{ij} matrix + real(pr), optional, intent(in) :: lij(:, :) !! l_{ij} matrix + real(pr), optional, intent(in) :: delta_1(:) + real(pr), optional, intent(in) :: k(:) + + type(AlphaRKPR) :: alpha + type(QMR) :: mixrule + type(Substances) :: composition + + integer :: i, nc + + real(pr), parameter :: d1 = 0.428364, & + d2 = 18.496215, & + d3=0.338426, & + d4=0.66, & + d5 = 789.723105, & + d6=2.512392 + + real(pr), parameter :: A1 = -2.4407 + real(pr), parameter :: A0 = 0.0017 + real(pr), parameter :: B1 =7.4513 + real(pr), parameter :: B0 =1.9681 + real(pr), parameter :: C1 =12.504 + real(pr), parameter :: C0 =-2.6238 + + real(pr) :: OMa(size(pc)), OMb(size(pc)) + real(pr) :: Zc_eos(size(pc)) + real(pr) :: Psat_i, diff + + nc = size(tc) + + composition%pc = pc + composition%tc = tc + composition%w = w + + Zc_eos = 1.168 * Zc + + if (present(k)) then alpha%k = k - else - alpha%k = (A1 * zc + A0)*w**2 + (B1*zc + B0)*w + (C1*Zc + C0) - end if - - if (present(kij)) then - mixrule%k = kij - else - mixrule%k = reshape([(0, i=1,nc**2)], [nc, nc]) - end if - - if (present(lij)) then - mixrule%l = lij - else - mixrule%l = reshape([(0, i=1,nc**2)], [nc, nc]) - end if - - model%components = composition - if (present(delta_1)) then + else + alpha%k = (A1 * Zc_eos + A0)*w**2 + (B1*zc + B0)*w + (C1*Zc_eos + C0) + end if + + if (present(kij)) then + mixrule%k = kij + else + mixrule%k = reshape([(0, i=1,nc**2)], [nc, nc]) + end if + + if (present(lij)) then + mixrule%l = lij + else + mixrule%l = reshape([(0, i=1,nc**2)], [nc, nc]) + end if + + model%components = composition + if (present(delta_1)) then model%del1 = delta_1 - else - model%del1 = d1 + d2 * (d3 - zc) ** d4 + d5 * (d3 - zc) ** d6 - end if - - model%del2 = (1._pr - model%del1)/(1._pr + model%del1) - model%alpha = alpha - - call get_OMa_OMb(model%del1, oma, omb) - model%ac = OMa * (R*Tc)**2/Pc - model%b = OMb * (R*Tc)/Pc - - model%mixrule = mixrule - model%name = "RKPR 2005" - end function - - subroutine get_OMa_OMb(del1, OMa, OMb) - real(pr), intent(in) :: del1(:) - real(pr), intent(out) :: OMa(size(del1)) - real(pr), intent(out) :: OMb(size(del1)) - - real(pr) :: d1(size(del1)), y(size(del1)) - - d1 = (1._pr + del1**2._pr)/(1._pr + del1) - y = 1._pr + (2._pr*(1._pr + del1))**(1.0_pr/3._pr) + (4._pr/(1._pr + del1))**(1.0_pr/3) - OMa = (3._pr*y*y + 3._pr*y*d1 + d1**2._pr + d1 - 1.0_pr)/(3._pr*y + d1 - 1.0_pr)**2._pr - OMb = 1._pr/(3._pr*y + d1 - 1.0_pr) - end subroutine -end module + else + model%del1 = d1 + d2 * (d3 - zc_eos) ** d4 + d5 * (d3 - zc_eos) ** d6 + end if + + model%del2 = (1._pr - model%del1)/(1._pr + model%del1) + model%alpha = alpha + + call get_OMa_OMb(model%del1, oma, omb) + model%ac = OMa * (R*Tc)**2/Pc + model%b = OMb * (R*Tc)/Pc + + model%mixrule = mixrule + model%name = "RKPR 2005" + + if (.not. present(k)) then + do i=1,nc + diff = 1 + do while (abs(diff) > 1e-6) + Psat_i = model%Psat_pure(i, 0.7*Tc(i)) + diff = (w(i) - (-1 - log10(Psat_i/Pc(i)))) + alpha%k(i) = alpha%k(i) + 0.1*diff + + deallocate(model%alpha) + model%alpha = alpha + end do + end do + end if + end function RKPR + + subroutine get_OMa_OMb(del1, OMa, OMb) + real(pr), intent(in) :: del1(:) + real(pr), intent(out) :: OMa(size(del1)) + real(pr), intent(out) :: OMb(size(del1)) + + real(pr) :: d1(size(del1)), y(size(del1)) + + d1 = (1._pr + del1**2._pr)/(1._pr + del1) + y = 1._pr + (2._pr*(1._pr + del1))**(1.0_pr/3._pr) + (4._pr/(1._pr + del1))**(1.0_pr/3) + OMa = (3._pr*y*y + 3._pr*y*d1 + d1**2._pr + d1 - 1.0_pr)/(3._pr*y + d1 - 1.0_pr)**2._pr + OMb = 1._pr/(3._pr*y + d1 - 1.0_pr) + end subroutine get_OMa_OMb +end module yaeos__models_ar_cubic_implementations diff --git a/src/models/residual_helmholtz/cubic/mixing_rules/quadratic_mixing.f90 b/src/models/residual_helmholtz/cubic/mixing_rules/quadratic_mixing.f90 index 1432b957a..568ef2d87 100644 --- a/src/models/residual_helmholtz/cubic/mixing_rules/quadratic_mixing.f90 +++ b/src/models/residual_helmholtz/cubic/mixing_rules/quadratic_mixing.f90 @@ -24,12 +24,8 @@ module yaeos__models_ar_cubic_quadratic_mixing procedure :: aij => kij_constant !! Default attractive parameter combining rule procedure :: Dmix !! Attractive parameter mixing rule procedure :: Bmix !! Repulsive parameter mixing rule - procedure :: D1mix => D1mix_constant + procedure :: D1mix => RKPR_D1mix end type QMR - type, extends(QMR) :: QMR_RKPR - contains - procedure :: D1Mix => RKPR_D1mix - end type QMR_RKPR type, extends(QMR) :: QMRTD real(pr), allocatable :: k0(:, :) @@ -147,24 +143,6 @@ subroutine Bmix(self, n, bi, B, dBi, dBij) call bmix_qmr(n, bi, self%l, b, dbi, dbij) end subroutine Bmix - subroutine D1mix_constant(self, n, d1i, D1, dD1i, dD1ij) - !! Constant \(\delta_1\) parameter. - !! - !! Most Cubic EoS keep a constant value for their \(\delta_1\) parameter. - !! This procedure assumes that all the components have the same \(delta_1\) - !! and takes the first value as the one of the mixture. - use yaeos__models_ar_cubic_mixing_base, only: d1mix_rkpr - class(QMR), intent(in) :: self !! Mixing rule - real(pr), intent(in) :: n(:) !! Moles vector - real(pr), intent(in) :: d1i(:) !! \(\delta_1\) parameter - real(pr), intent(out) :: D1 !! Mixture's \(\Delta_1\) - real(pr), intent(out) :: dD1i(:) !! \(\frac{dDelta_1}{dn_i} = 0\) - real(pr), intent(out) :: dD1ij(:, :) !! \(\frac{d^2Delta_1}{dn_{ij}} = 0\) - D1 = d1i(1) - dD1i = 0 - dD1ij = 0 - end subroutine D1mix_constant - subroutine RKPR_D1mix(self, n, d1i, D1, dD1i, dD1ij) use yaeos__models_ar_cubic_mixing_base, only: d1mix_rkpr !! RKPR \(\delta_1\) parameter mixing rule. @@ -177,7 +155,7 @@ subroutine RKPR_D1mix(self, n, d1i, D1, dD1i, dD1ij) !! \Delta_1 = \sum_i^N n_i \delta_{1i} !! \] !! - class(QMR_RKPR), intent(in) :: self + class(QMR), intent(in) :: self real(pr), intent(in) :: n(:) real(pr), intent(in) :: d1i(:) real(pr), intent(out) :: D1 @@ -287,7 +265,7 @@ subroutine kij_exp_tdep(& nc = size(a) - do i=1,size(a)-1 + do i=1,size(a) aij_hd(i, i) = sqrt(a_hd(i) * a_hd(i)) do j=i+1,size(a) aij_hd(i, j) = sqrt(a_hd(i) * a_hd(j)) * (1._pr - kij_hd(i, j)) @@ -295,8 +273,6 @@ subroutine kij_exp_tdep(& end do end do - aij_hd(size(a), size(a)) = sqrt(a_hd(size(a)) * a_hd(size(a))) - aij = aij_hd%f0 daijdt = aij_hd%f1 daijdt2 = aij_hd%f12 diff --git a/src/models/residual_helmholtz/multifluid/gerg2008.f90 b/src/models/residual_helmholtz/multifluid/gerg2008.f90 new file mode 100644 index 000000000..0046234f3 --- /dev/null +++ b/src/models/residual_helmholtz/multifluid/gerg2008.f90 @@ -0,0 +1,221 @@ +module yaeos__models_ar_gerg2008 + use yaeos__constants, only: Ryaeos => R, pr !! Ideal gas constants used on yaeos + use yaeos__adiff_hyperdual_ar_api, only: ArModelAdiff + use yaeos__models_ar_cubic_implementations, only: SoaveRedlichKwong + use yaeos__models_ar_genericcubic, only: CubicEoS + use yaeos__models_ar_multifluid_parameters_gerg2008, only: Gerg2008Binary, Gerg2008Pure + + use hyperdual_mod + + implicit none + + type, extends(ArModelAdiff) :: Gerg2008 + type(Gerg2008Pure), allocatable :: pures(:) + type(Gerg2008Binary), allocatable :: binaries(:, :) + type(CubicEoS) :: srk + contains + procedure :: ar => arfun + procedure :: get_v0 => volume_initalizer + end type Gerg2008 + + type, private :: GERG2008Selector + integer :: methane=1 + integer :: nitrogen=2 + integer :: carbon_dioxide=3 + integer :: ethane=4 + integer :: propane=5 + integer :: nbutane=6 + integer :: isobutane=7 + integer :: npentane=8 + integer :: isopentane=9 + integer :: nhexane=10 + integer :: nheptane=11 + integer :: noctane=12 + integer :: nonane=13 + integer :: decane=14 + integer :: hydrogen=15 + integer :: oxygen=16 + integer :: carbon_monoxide=17 + integer :: water=18 + integer :: hydrogen_sulfide=19 + integer :: helium=20 + integer :: argon=21 + end type GERG2008Selector + + type(GERG2008Selector) :: G2008Components + +contains + + type(Gerg2008) function gerg_2008(ids) + use yaeos__models_ar_multifluid_parameters_gerg2008, only: get_original_parameters + integer, intent(in) :: ids(:) + type(Gerg2008Pure) :: pures(size(ids)) + type(Gerg2008Binary) :: binaries(size(ids), size(ids)) + + call get_original_parameters(ids, pures, binaries, gerg_2008%components) + gerg_2008%pures = pures + gerg_2008%binaries = binaries + gerg_2008%srk =SoaveRedlichKwong(gerg_2008%components%Tc, gerg_2008%components%Pc, gerg_2008%components%w) + end function gerg_2008 + + subroutine reducing_functions(self, n, Vr, Tr) + class(Gerg2008), intent(in) :: self + type(hyperdual), intent(in) :: n(:) + type(hyperdual), intent(out) :: Vr + type(hyperdual), intent(out) :: Tr + + type(hyperdual) :: X(size(n)) + + real(8) :: Vc(size(n)), Tc(size(n)), rho_c(size(n)) + + real(8) :: Bv(size(n), size(n)), Gv(size(n), size(n)) + real(8) :: Bt(size(n), size(n)), Gt(size(n), size(n)) + + integer :: i, j, nc + + Vc = self%components%Vc + Tc = self%components%Tc + Bv = self%binaries%Bv + Gv = self%binaries%Gv + Bt = self%binaries%Bt + Gt = self%binaries%Gt + + rho_c = 1/Vc + X = n / sum(n) + nc = size(n) + + Vr = sum(X ** 2 * Vc) + Tr = sum(X ** 2 * Tc) + + do i=1,nc + do j=i+1,nc + Vr = Vr + & + 2 * X(i) * X(j) * Bv(i, j) * Gv(i, j) & + * (X(i) + X(j)) / (Bv(i, j) ** 2 * X(i) + X(j)) & + * 1._pr / 8._pr * (rho_c(i) ** (- 1._pr / 3._pr) & + + rho_c(j) ** (- 1._pr / 3)) ** 3 + + Tr = Tr + & + 2 * X(i) * X(j) * Bt(i, j) * Gt(i, j) & + * (X(i) + X(j)) / (Bt(i, j) ** 2 * X(i) + X(j)) & + * sqrt((Tc(i) * Tc(j))) + end do + end do + end subroutine reducing_functions + + subroutine ar_pure(pure, delta, tau, ar) + type(Gerg2008Pure), intent(in) :: pure + type(hyperdual), intent(in) :: delta + type(hyperdual), intent(in) :: tau + type(hyperdual), intent(out) :: ar + + integer :: i, Kpol, Kexp + + real(8) :: n_pol(pure%Kpol), d_pol(pure%Kpol), t_pol(pure%Kpol) + real(8) :: n_exp(pure%Kexp), d_exp(pure%Kexp), t_exp(pure%Kexp) + real(8) :: c_exp(pure%Kexp) + + Kpol = pure%Kpol + Kexp = pure%Kexp + + n_pol = pure%n(1:Kpol) + d_pol = pure%d(1:Kpol) + t_pol = pure%t(1:Kpol) + n_exp = pure%n(Kpol+1:Kpol+Kexp) + d_exp = pure%d(Kpol+1:Kpol+Kexp) + t_exp = pure%t(Kpol+1:Kpol+Kexp) + + c_exp = pure%c + + ar = sum(n_pol * delta ** d_pol * tau ** t_pol) + & + sum(n_exp * delta**d_exp * tau**t_exp * exp(-delta**c_exp)) + end subroutine ar_pure + + subroutine ar_ij(delta, tau, binary, aij) + type(hyperdual), intent(in) :: delta + type(hyperdual), intent(in) :: tau + type(Gerg2008Binary), intent(in) :: binary + type(hyperdual), intent(out) :: aij + + integer :: idx_poly, idx_exp + + real(8) :: n_pol(binary%Kpolij), d_pol(binary%Kpolij), t_pol(binary%Kpolij) + real(8) :: n_exp(binary%Kexpij), d_exp(binary%Kexpij), t_exp(binary%Kexpij) + real(8) :: etha(binary%Kexpij), eps(binary%Kexpij), beta(binary%Kexpij), gama(binary%Kexpij) + + idx_poly = binary%Kpolij + idx_exp = binary%Kexpij + idx_poly + + n_pol = binary%nij(1:idx_poly) + d_pol = binary%dij(1:idx_poly) + t_pol = binary%tij(1:idx_poly) + + n_exp = binary%nij(idx_poly+1:idx_exp) + d_exp = binary%dij(idx_poly+1:idx_exp) + t_exp = binary%tij(idx_poly+1:idx_exp) + + etha = binary%ethaij(1:binary%Kexpij) + eps = binary%epsij(1:binary%Kexpij) + beta = binary%betaij(1:binary%Kexpij) + gama = binary%gammaij(1:binary%Kexpij) + + aij = sum(n_pol * delta ** d_pol * tau ** t_pol) + & + sum(n_exp * delta**d_exp * tau**t_exp * exp(-etha * (delta - eps) ** 2 - beta * (delta - gama))) + end subroutine ar_ij + + function arfun(self, n, v, t) result(arval) + class(Gerg2008) :: self + type(hyperdual), intent(in) :: n(:), v, t + type(hyperdual) :: arval + + type(hyperdual) :: Vr, Tr, X(size(n)), rho_r + type(hyperdual) :: delta, tau + type(hyperdual) :: aij + type(hyperdual) :: ar_pures(size(n)) + + type(Gerg2008Pure) :: pures(size(n)) + type(Gerg2008Binary) :: binary + + real(pr) :: rho_c(size(n)) + real(pr) :: Fij(size(n), size(n)) + integer :: i, j, nc + + Fij = self%binaries%Fij + + pures = self%pures + + nc = size(n) + X = n / sum(n) + call reducing_functions(self, n, Vr, Tr) + + rho_r = 1._pr/Vr + + delta = (1._pr/(V/sum(n)))/rho_r + tau = Tr/T + + do i=1,nc + call ar_pure(pures(i), delta, tau, ar_pures(i)) + end do + + arval = sum(x * ar_pures) + + do i=1,nc + do j=1,nc!i+1,nc + if (Fij(i, j) == 0._pr) cycle + binary = self%binaries(i, j) + call ar_ij(delta, tau, binary, aij) + arval = arval + X(i) * X(j) * Fij(i, j) * aij + end do + end do + arval = arval * (sum(n) * ryaeos * t) + end function arfun + + function volume_initalizer(self, n, p, t) result(v0) + class(Gerg2008), intent(in) :: self + real(pr), intent(in) :: n(:) + real(pr), intent(in) :: p + real(pr), intent(in) :: t + real(pr) :: v0 + v0 = self%srk%get_v0(n, p, t) + end function volume_initalizer +end module yaeos__models_ar_gerg2008 \ No newline at end of file diff --git a/src/models/residual_helmholtz/multifluid/parameters_gerg2008.f90 b/src/models/residual_helmholtz/multifluid/parameters_gerg2008.f90 new file mode 100644 index 000000000..462ed6ff4 --- /dev/null +++ b/src/models/residual_helmholtz/multifluid/parameters_gerg2008.f90 @@ -0,0 +1,1774 @@ +module yaeos__models_ar_multifluid_parameters_gerg2008 + use yaeos__constants, only: pr + use yaeos__models_base, only: Substances + implicit none + + integer :: max_residual_terms = 24, generalized_departure(8, 2) + integer, parameter :: N = 21 + real(8), dimension(21, 21, 4) :: red_params + real(8), dimension(21, 21) :: Bv=0, Gv=0, Bt=0, Gt=0 + real(8), dimension(21, 24) :: noik=0, toik=0 + integer, dimension(21, 24) :: doik=0, coik=0 + integer, dimension(21) :: Kpol=0, Kexp=0 + real(8), dimension(21, 21) :: Fij=0 + real(8), dimension(21, 21, 12) :: tij=0, nij=0, ethaij=0, epsij=0, betaij=0, gammaij=0 + integer, dimension(21, 21, 12) :: dij=0 + integer, dimension(21, 21) :: Kpolij=0, Kexpij=0 + real(8), dimension(21) :: T_c=0, rho_c=0, M=0, P_c=0, acentric_factor=0 + integer :: tmp1(3)=0, tmp2(14)=0 ! This variables are used to define indexes for repeated terms + real(8), dimension(21, 7) :: n0i=0, th0i=0 + real(8) :: R=0, eps = 1d-10 + + type :: Gerg2008Pure + integer :: Kpol + integer :: Kexp + real(8), allocatable :: n(:) + real(8), allocatable :: d(:) + real(8), allocatable :: t(:) + real(8), allocatable :: c(:) + end type Gerg2008Pure + + type :: Gerg2008Binary + integer :: i !! Component i + integer :: j !! Component j + real(8) :: Bv !! Binary volume interaction parameters + real(8) :: Gv !! Binary volume interaction parameters + real(8) :: Bt !! Binary temperature interaction parameters + real(8) :: Gt !! Binary temperature interaction parameters + integer :: Kpolij + integer :: Kexpij + real(8), allocatable :: nij(:) + real(8), allocatable :: dij(:) + real(8), allocatable :: tij(:) + real(8), allocatable :: ethaij(:) + real(8), allocatable :: epsij(:) + real(8), allocatable :: betaij(:) + real(8), allocatable :: gammaij(:) + real(8) :: Fij + end type Gerg2008Binary + +contains + + subroutine get_original_parameters(ids, pures, binaries, components) + integer, intent(in) :: ids(:) + type(Gerg2008Pure), intent(out) :: pures(:) + type(Gerg2008Binary), intent(out) :: binaries(:, :) + type(Substances), intent(out) :: components + + integer :: i, j + integer :: nc + integer :: ikpol, ikexp + real(pr) :: Tc(size(ids)), Pc(size(ids)), w(size(ids)), Vc(size(ids)) + + nc = size(ids) + call original_parameters() + + Tc = [(T_c(ids(i)), i=1,nc)] + Pc = [(P_c(ids(i)), i=1,nc)]/1e5 + w = [(acentric_factor(ids(i)), i=1,nc)] + Vc = [(1/rho_c(ids(i)), i=1,nc)] + + components = Substances(Tc=Tc, Pc=Pc, w=w, Vc=Vc) + + do i=1,nc + pures(i)%kpol = kpol(ids(i)) + pures(i)%kexp = kexp(ids(i)) + pures(i)%n = noik(ids(i), :) + pures(i)%d = doik(ids(i), :) + pures(i)%t = toik(ids(i), :) + pures(i)%c = coik(ids(i), kpol(ids(i))+1:kexp(ids(i))+kpol(ids(i))) + end do + + do i=1,nc + do j=1,nc + binaries(i, j)%Bt = Bt(ids(i), ids(j)) + binaries(i, j)%Gt = Gt(ids(i), ids(j)) + binaries(i, j)%Bv = Bv(ids(i), ids(j)) + binaries(i, j)%Gv = Gv(ids(i), ids(j)) + + ikpol = Kpolij(ids(i), ids(j)) + ikexp = Kexpij(ids(i), ids(j)) + + binaries(i, j)%Kpolij = Kpolij(ids(i), ids(j)) + binaries(i, j)%Kexpij = Kexpij(ids(i), ids(j)) + + binaries(i, j)%nij = nij(ids(i), ids(j), :ikexp+ikpol) + binaries(i, j)%dij = dij(ids(i), ids(j), :ikexp+ikpol) + binaries(i, j)%tij = tij(ids(i), ids(j), :ikexp+ikpol) + binaries(i, j)%ethaij = ethaij(ids(i), ids(j), ikpol+1:ikexp+ikpol) + binaries(i, j)%epsij = epsij(ids(i), ids(j), ikpol+1:ikexp+ikpol) + binaries(i, j)%betaij = betaij(ids(i), ids(j), ikpol+1:ikexp+ikpol) + binaries(i, j)%gammaij = gammaij(ids(i), ids(j), ikpol+1:ikexp+ikpol) + binaries(i, j)%Fij = Fij(ids(i), ids(j)) + end do + end do + + end subroutine get_original_parameters + + subroutine original_parameters() + !! Parameter table of the original GERG 2008 model + integer :: i, j, k + R = 8.314472d0 + + P_c(1) = 46.0 * 1d5 + P_c(2) = 33.9 * 1d5 + P_c(3) = 73.8 * 1d5 + P_c(4) = 48.8 * 1d5 + P_c(5) = 42.5 * 1d5 + P_c(6) = 38.0 * 1d5 + P_c(7) = 36.5 * 1d5 + P_c(8) = 33.7 * 1d5 + P_c(9) = 33.9 * 1d5 + P_c(10) = 30.1 * 1d5 + P_c(11) = 27.4 * 1d5 + P_c(12) = 24.9 * 1d5 + P_c(13) = 2281000.0d0 + P_c(14) = 2103000.0d0 + P_c(15) = 1296400.0d0 + P_c(16) = 5043000.0d0 + P_c(17) = 3494000.0d0 + P_c(18) = 22064000.0d0 + P_c(19) = 9000000.0d0 + P_c(20) = 227600.0d0 + P_c(21) = 4863000.0d0 + + acentric_factor(1) = 0.011 + acentric_factor(2) = 0.039 + acentric_factor(3) = 0.239 + acentric_factor(4) = 0.099 + acentric_factor(5) = 0.153 + acentric_factor(6) = 0.199 + acentric_factor(7) = 0.183 + acentric_factor(8) = 0.251 + acentric_factor(9) = 0.227 + acentric_factor(10) = 0.299 + acentric_factor(11) = 0.349 + acentric_factor(12) = 0.398 + acentric_factor(13) = 0.4433 + acentric_factor(14) = 0.4884 + acentric_factor(15) = - 0.219 + acentric_factor(16) = 0.0222 + acentric_factor(17) = 0.0497 + acentric_factor(18) = 0.3442920843 + acentric_factor(19) = 0.1005 + acentric_factor(20) = - 0.3836 + acentric_factor(21) = - 0.00219 + + T_c(1) = 190.564d0 + T_c(2) = 126.192d0 + T_c(3) = 304.1282d0 + T_c(4) = 305.322d0 + T_c(5) = 369.825d0 + T_c(6) = 425.125d0 + T_c(7) = 407.817d0 + T_c(8) = 469.7d0 + T_c(9) = 460.35d0 + T_c(10) = 507.82d0 + T_c(11) = 540.13d0 + T_c(12) = 569.32d0 + T_c(13) = 594.55d0 + T_c(14) = 617.7d0 + T_c(15) = 33.19d0 + T_c(16) = 154.595d0 + T_c(17) = 132.86d0 + T_c(18) = 647.096d0 + T_c(19) = 373.1d0 + T_c(20) = 5.1953d0 + T_c(21) = 150.687d0 + + rho_c(1) = 10.139342719d0 + rho_c(2) = 11.1839d0 + rho_c(3) = 10.624978698d0 + rho_c(4) = 6.870854540d0 + rho_c(5) = 5.000043088d0 + rho_c(6) = 3.920016792d0 + rho_c(7) = 3.860142940d0 + rho_c(8) = 3.215577588d0 + rho_c(9) = 3.271d0 + rho_c(10) = 2.705877875d0 + rho_c(11) = 2.315324434d0 + rho_c(12) = 2.056404127d0 + rho_c(13) = 1.81d0 + rho_c(14) = 1.64d0 + rho_c(15) = 14.94d0 + rho_c(16) = 13.63d0 + rho_c(17) = 10.85d0 + rho_c(18) = 17.873716090d0 + rho_c(19) = 10.19d0 + rho_c(20) = 17.399d0 + rho_c(21) = 13.407429659d0 + + M(1) = 16.04246d0 + M(2) = 28.0134d0 + M(3) = 44.0095d0 + M(4) = 30.06904d0 + M(5) = 44.09562d0 + M(6) = 58.1222d0 + M(7) = 58.1222d0 + M(8) = 72.14878d0 + M(9) = 72.14878d0 + M(10) = 86.17536d0 + M(11) = 100.20194d0 + M(12) = 114.22852d0 + M(13) = 128.2551d0 + M(14) = 142.28168d0 + M(15) = 2.01588d0 + M(16) = 31.9988d0 + M(17) = 28.0101d0 + M(18) = 18.01528d0 + M(19) = 34.08088d0 + M(20) = 4.002602d0 + M(21) = 39.948d0 + + Fij(1, 2) = 1.0d0 + Fij(1, 3) = 1.0d0 + Fij(1, 4) = 1.0d0 + Fij(1, 5) = 1.0d0 + Fij(1, 6) = 1.0d0 + Fij(1, 7) = 0.771035405688d0 + Fij(1, 15) = 1.0d0 + Fij(2, 3) = 1.0d0 + Fij(2, 4) = 1.0d0 + Fij(4, 5) = 0.130424765150d0 + Fij(4, 6) = 0.281570073085d0 + Fij(4, 7) = 0.260632376098d0 + Fij(5, 6) = 0.312572600489d-1 + Fij(5, 7) = - 0.551609771024d-1 + Fij(6, 7) = - 0.551240293009d-1 + + Fij(2, 1) = 1.0d0 + Fij(3, 1) = 1.0d0 + Fij(3, 2) = 1.0d0 + Fij(4, 1) = 1.0d0 + Fij(4, 2) = 1.0d0 + Fij(5, 1) = 1.0d0 + Fij(5, 4) = 0.130424765150d0 + Fij(6, 1) = 1.0d0 + Fij(6, 4) = 0.281570073085d0 + Fij(6, 5) = 0.312572600489d-1 + Fij(7, 1) = 0.771035405688d0 + Fij(7, 4) = 0.260632376098d0 + Fij(7, 5) = - 0.551609771024d-1 + Fij(7, 6) = - 0.551240293009d-1 + Fij(15, 1) = 1.0d0 + + red_params(1, 2, :) = (/ 0.998721377d0, 1.013950311d0, 0.998098830d0, 0.979273013d0 /) + red_params(1, 3, :) = (/ 0.999518072d0, 1.002806594d0, 1.022624490d0, 0.975665369d0 /) + red_params(1, 4, :) = (/ 0.997547866d0, 1.006617867d0, 0.996336508d0, 1.049707697d0 /) + red_params(1, 5, :) = (/ 1.004827070d0, 1.038470657d0, 0.989680305d0, 1.098655531d0 /) + red_params(1, 6, :) = (/ 0.979105972d0, 1.045375122d0, 0.994174910d0, 1.171607691d0 /) + red_params(1, 7, :) = (/ 1.011240388d0, 1.054319053d0, 0.980315756d0, 1.161117729d0 /) + red_params(1, 8, :) = (/ 0.948330120d0, 1.124508039d0, 0.992127525d0, 1.249173968d0 /) + red_params(1, 9, :) = (/ 1.0d0, 1.343685343d0, 1.0d0, 1.188899743d0 /) + red_params(1, 10, :) = (/ 0.958015294d0, 1.052643846d0, 0.981844797d0, 1.330570181d0 /) + red_params(1, 11, :) = (/ 0.962050831d0, 1.156655935d0, 0.977431529d0, 1.379850328d0 /) + red_params(1, 12, :) = (/ 0.994740603d0, 1.116549372d0, 0.957473785d0, 1.449245409d0 /) + red_params(1, 13, :) = (/ 1.002852287d0, 1.141895355d0, 0.947716769d0, 1.528532478d0 /) + red_params(1, 14, :) = (/ 1.033086292d0, 1.146089637d0, 0.937777823d0, 1.568231489d0 /) + red_params(1, 15, :) = (/ 1.0d0, 1.018702573d0, 1.0d0, 1.352643115d0 /) + red_params(1, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 0.950000000d0 /) + red_params(1, 17, :) = (/ 0.997340772d0, 1.006102927d0, 0.987411732d0, 0.987473033d0 /) + red_params(1, 18, :) = (/ 1.012783169d0, 1.585018334d0, 1.063333913d0, 0.775810513d0 /) + red_params(1, 19, :) = (/ 1.012599087d0, 1.040161207d0, 1.011090031d0, 0.961155729d0 /) + red_params(1, 20, :) = (/ 1.0d0, 0.881405683d0, 1.0d0, 3.159776855d0 /) + red_params(1, 21, :) = (/ 1.034630259d0, 1.014678542d0, 0.990954281d0, 0.989843388d0 /) + red_params(2, 3, :) = (/ 0.977794634d0, 1.047578256d0, 1.005894529d0, 1.107654104d0 /) + red_params(2, 4, :) = (/ 0.978880168d0, 1.042352891d0, 1.007671428d0, 1.098650964d0 /) + red_params(2, 5, :) = (/ 0.974424681d0, 1.081025408d0, 1.002677329d0, 1.201264026d0 /) + red_params(2, 6, :) = (/ 0.996082610d0, 1.146949309d0, 0.994515234d0, 1.304886838d0 /) + red_params(2, 7, :) = (/ 0.986415830d0, 1.100576129d0, 0.992868130d0, 1.284462634d0 /) + red_params(2, 8, :) = (/ 1.0d0, 1.078877166d0, 1.0d0, 1.419029041d0 /) + red_params(2, 9, :) = (/ 1.0d0, 1.154135439d0, 1.0d0, 1.381770770d0 /) + red_params(2, 10, :) = (/ 1.0d0, 1.195952177d0, 1.0d0, 1.472607971d0 /) + red_params(2, 11, :) = (/ 1.0d0, 1.404554090d0, 1.0d0, 1.520975334d0 /) + red_params(2, 12, :) = (/ 1.0d0, 1.186067025d0, 1.0d0, 1.733280051d0 /) + red_params(2, 13, :) = (/ 1.0d0, 1.100405929d0, 0.956379450d0, 1.749119996d0 /) + red_params(2, 14, :) = (/ 1.0d0, 1.0d0, 0.957934447d0, 1.822157123d0 /) + red_params(2, 15, :) = (/ 0.972532065d0, 0.970115357d0, 0.946134337d0, 1.175696583d0 /) + red_params(2, 17, :) = (/ 1.0d0, 1.008690943d0, 1.0d0, 0.993425388d0 /) + red_params(2, 18, :) = (/ 1.0d0, 1.094749685d0, 1.0d0, 0.968808467d0 /) + red_params(2, 16, :) = (/ 0.999521770d0, 0.997082328d0, 0.997190589d0, 0.995157044d0 /) + red_params(2, 19, :) = (/ 0.910394249d0, 1.256844157d0, 1.004692366d0, 0.960174200d0 /) + red_params(2, 20, :) = (/ 0.969501055d0, 0.932629867d0, 0.692868765d0, 1.471831580d0 /) + red_params(2, 21, :) = (/ 1.004166412d0, 1.002212182d0, 0.999069843d0, 0.990034831d0 /) + red_params(3, 4, :) = (/ 1.002525718d0, 1.032876701d0, 1.013871147d0, 0.900949530d0 /) + red_params(3, 5, :) = (/ 0.996898004d0, 1.047596298d0, 1.033620538d0, 0.908772477d0 /) + red_params(3, 6, :) = (/ 1.174760923d0, 1.222437324d0, 1.018171004d0, 0.911498231d0 /) + red_params(3, 7, :) = (/ 1.076551882d0, 1.081909003d0, 1.023339824d0, 0.929982936d0 /) + red_params(3, 8, :) = (/ 1.024311498d0, 1.068406078d0, 1.027000795d0, 0.979217302d0 /) + red_params(3, 9, :) = (/ 1.060793104d0, 1.116793198d0, 1.019180957d0, 0.961218039d0 /) + red_params(3, 10, :) = (/ 1.0d0, 0.851343711d0, 1.0d0, 1.038675574d0 /) + red_params(3, 11, :) = (/ 1.205469976d0, 1.164585914d0, 1.011806317d0, 1.046169823d0 /) + red_params(3, 12, :) = (/ 1.026169373d0, 1.104043935d0, 1.029690780d0, 1.074455386d0 /) + red_params(3, 13, :) = (/ 1.0d0, 0.973386152d0, 1.007688620d0, 1.140671202d0 /) + red_params(3, 14, :) = (/ 1.000151132d0, 1.183394668d0, 1.020028790d0, 1.145512213d0 /) + red_params(3, 15, :) = (/ 0.904142159d0, 1.152792550d0, 0.942320195d0, 1.782924792d0 /) + red_params(3, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(3, 17, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(3, 18, :) = (/ 0.949055959d0, 1.542328793d0, 0.997372205d0, 0.775453996d0 /) + red_params(3, 19, :) = (/ 0.906630564d0, 1.024085837d0, 1.016034583d0, 0.926018880d0 /) + red_params(3, 20, :) = (/ 0.846647561d0, 0.864141549d0, 0.768377630d0, 3.207456948d0 /) + red_params(3, 21, :) = (/ 1.008392428d0, 1.029205465d0, 0.996512863d0, 1.050971635d0 /) + red_params(4, 5, :) = (/ 0.997607277d0, 1.003034720d0, 0.996199694d0, 1.014730190d0 /) + red_params(4, 6, :) = (/ 0.999157205d0, 1.006179146d0, 0.999130554d0, 1.034832749d0 /) + red_params(4, 7, :) = (/ 1.0d0, 1.006616886d0, 1.0d0, 1.033283811d0 /) + red_params(4, 8, :) = (/ 0.993851009d0, 1.026085655d0, 0.998688946d0, 1.066665676d0 /) + red_params(4, 9, :) = (/ 1.0d0, 1.045439935d0, 1.0d0, 1.021150247d0 /) + red_params(4, 10, :) = (/ 1.0d0, 1.169701102d0, 1.0d0, 1.092177796d0 /) + red_params(4, 11, :) = (/ 1.0d0, 1.057666085d0, 1.0d0, 1.134532014d0 /) + red_params(4, 12, :) = (/ 1.007469726d0, 1.071917985d0, 0.984068272d0, 1.168636194d0 /) + red_params(4, 13, :) = (/ 1.0d0, 1.143534730d0, 1.0d0, 1.056033030d0 /) + red_params(4, 14, :) = (/ 0.995676258d0, 1.098361281d0, 0.970918061d0, 1.237191558d0 /) + red_params(4, 15, :) = (/ 0.925367171d0, 1.106072040d0, 0.932969831d0, 1.902008495d0 /) + red_params(4, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(4, 17, :) = (/ 1.0d0, 1.201417898d0, 1.0d0, 1.069224728d0 /) + red_params(4, 18, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(4, 19, :) = (/ 1.010817909d0, 1.030988277d0, 0.990197354d0, 0.902736660d0 /) + red_params(4, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(4, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(5, 6, :) = (/ 0.999795868d0, 1.003264179d0, 1.000310289d0, 1.007392782d0 /) + red_params(5, 7, :) = (/ 0.999243146d0, 1.001156119d0, 0.998012298d0, 1.005250774d0 /) + red_params(5, 8, :) = (/ 1.044919431d0, 1.019921513d0, 0.996484021d0, 1.008344412d0 /) + red_params(5, 9, :) = (/ 1.040459289d0, 0.999432118d0, 0.994364425d0, 1.003269500d0 /) + red_params(5, 10, :) = (/ 1.0d0, 1.057872566d0, 1.0d0, 1.025657518d0 /) + red_params(5, 11, :) = (/ 1.0d0, 1.079648053d0, 1.0d0, 1.050044169d0 /) + red_params(5, 12, :) = (/ 1.0d0, 1.102764612d0, 1.0d0, 1.063694129d0 /) + red_params(5, 13, :) = (/ 1.0d0, 1.199769134d0, 1.0d0, 1.109973833d0 /) + red_params(5, 14, :) = (/ 0.984104227d0, 1.053040574d0, 0.985331233d0, 1.140905252d0 /) + red_params(5, 15, :) = (/ 1.0d0, 1.074006110d0, 1.0d0, 2.308215191d0 /) + red_params(5, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(5, 17, :) = (/ 1.0d0, 1.108143673d0, 1.0d0, 1.197564208d0 /) + red_params(5, 18, :) = (/ 1.0d0, 1.011759763d0, 1.0d0, 0.600340961d0 /) + red_params(5, 19, :) = (/ 0.936811219d0, 1.010593999d0, 0.992573556d0, 0.905829247d0 /) + red_params(5, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(5, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(6, 7, :) = (/ 1.000880464d0, 1.000414440d0, 1.000077547d0, 1.001432824d0 /) + red_params(6, 8, :) = (/ 1.0d0, 1.018159650d0, 1.0d0, 1.002143640d0 /) + red_params(6, 9, :) = (/ 1.0d0, 1.002728434d0, 1.0d0, 1.000792201d0 /) + red_params(6, 10, :) = (/ 1.0d0, 1.034995284d0, 1.0d0, 1.009157060d0 /) + red_params(6, 11, :) = (/ 1.0d0, 1.019174227d0, 1.0d0, 1.021283378d0 /) + red_params(6, 12, :) = (/ 1.0d0, 1.046905515d0, 1.0d0, 1.033180106d0 /) + red_params(6, 13, :) = (/ 1.0d0, 1.049219137d0, 1.0d0, 1.014096448d0 /) + red_params(6, 14, :) = (/ 0.976951968d0, 1.027845529d0, 0.993688386d0, 1.076466918d0 /) + red_params(6, 15, :) = (/ 1.0d0, 1.232939523d0, 1.0d0, 2.509259945d0 /) + red_params(6, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(6, 17, :) = (/ 1.0d0, 1.084740904d0, 1.0d0, 1.173916162d0 /) + red_params(6, 18, :) = (/ 1.0d0, 1.223638763d0, 1.0d0, 0.615512682d0 /) + red_params(6, 19, :) = (/ 0.908113163d0, 1.033366041d0, 0.985962886d0, 0.926156602d0 /) + red_params(6, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(6, 21, :) = (/ 1.0d0, 1.214638734d0, 1.0d0, 1.245039498d0 /) + red_params(7, 8, :) = (/ 1.0d0, 1.002779804d0, 1.0d0, 1.002495889d0 /) + red_params(7, 9, :) = (/ 1.0d0, 1.002284353d0, 1.0d0, 1.001835788d0 /) + red_params(7, 10, :) = (/ 1.0d0, 1.010493989d0, 1.0d0, 1.006018054d0 /) + red_params(7, 11, :) = (/ 1.0d0, 1.021668316d0, 1.0d0, 1.009885760d0 /) + red_params(7, 12, :) = (/ 1.0d0, 1.032807063d0, 1.0d0, 1.013945424d0 /) + red_params(7, 13, :) = (/ 1.0d0, 1.047298475d0, 1.0d0, 1.017817492d0 /) + red_params(7, 14, :) = (/ 1.0d0, 1.060243344d0, 1.0d0, 1.021624748d0 /) + red_params(7, 15, :) = (/ 1.0d0, 1.147595688d0, 1.0d0, 1.895305393d0 /) + red_params(7, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(7, 17, :) = (/ 1.0d0, 1.087272232d0, 1.0d0, 1.161390082d0 /) + red_params(7, 18, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(7, 19, :) = (/ 1.012994431d0, 0.988591117d0, 0.974550548d0, 0.937130844d0 /) + red_params(7, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(7, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(8, 9, :) = (/ 1.0d0, 1.000024335d0, 1.0d0, 1.000050537d0 /) + red_params(8, 10, :) = (/ 1.0d0, 1.002480637d0, 1.0d0, 1.000761237d0 /) + red_params(8, 11, :) = (/ 1.0d0, 1.008972412d0, 1.0d0, 1.002441051d0 /) + red_params(8, 12, :) = (/ 1.0d0, 1.069223964d0, 1.0d0, 1.016422347d0 /) + red_params(8, 13, :) = (/ 1.0d0, 1.034910633d0, 1.0d0, 1.103421755d0 /) + red_params(8, 14, :) = (/ 1.0d0, 1.016370338d0, 1.0d0, 1.049035838d0 /) + red_params(8, 15, :) = (/ 1.0d0, 1.188334783d0, 1.0d0, 2.013859174d0 /) + red_params(8, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(8, 17, :) = (/ 1.0d0, 1.119954454d0, 1.0d0, 1.206043295d0 /) + red_params(8, 18, :) = (/ 1.0d0, 0.956677310d0, 1.0d0, 0.447666011d0 /) + red_params(8, 19, :) = (/ 0.984613203d0, 1.076539234d0, 0.962006651d0, 0.959065662d0 /) + red_params(8, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(8, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(9, 10, :) = (/ 1.0d0, 1.002995876d0, 1.0d0, 1.001204174d0 /) + red_params(9, 11, :) = (/ 1.0d0, 1.009928206d0, 1.0d0, 1.003194615d0 /) + red_params(9, 12, :) = (/ 1.0d0, 1.017880545d0, 1.0d0, 1.005647480d0 /) + red_params(9, 13, :) = (/ 1.0d0, 1.028994325d0, 1.0d0, 1.008191499d0 /) + red_params(9, 14, :) = (/ 1.0d0, 1.039372957d0, 1.0d0, 1.010825138d0 /) + red_params(9, 15, :) = (/ 1.0d0, 1.184340443d0, 1.0d0, 1.996386669d0 /) + red_params(9, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(9, 17, :) = (/ 1.0d0, 1.116694577d0, 1.0d0, 1.199326059d0 /) + red_params(9, 18, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(9, 19, :) = (/ 1.0d0, 0.835763343d0, 1.0d0, 0.982651529d0 /) + red_params(9, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(9, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(10, 11, :) = (/ 1.0d0, 1.001508227d0, 1.0d0, 0.999762786d0 /) + red_params(10, 12, :) = (/ 1.0d0, 1.006268954d0, 1.0d0, 1.001633952d0 /) + red_params(10, 13, :) = (/ 1.0d0, 1.020761680d0, 1.0d0, 1.055369591d0 /) + red_params(10, 14, :) = (/ 1.001516371d0, 1.013511439d0, 0.997641010d0, 1.028939539d0 /) + red_params(10, 15, :) = (/ 1.0d0, 1.243461678d0, 1.0d0, 3.021197546d0 /) + red_params(10, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(10, 17, :) = (/ 1.0d0, 1.155145836d0, 1.0d0, 1.233272781d0 /) + red_params(10, 18, :) = (/ 1.0d0, 1.170217596d0, 1.0d0, 0.569681333d0 /) + red_params(10, 19, :) = (/ 0.754473958d0, 1.339283552d0, 0.985891113d0, 0.956075596d0 /) + red_params(10, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(10, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(11, 12, :) = (/ 1.0d0, 1.006767176d0, 1.0d0, 0.998793111d0 /) + red_params(11, 13, :) = (/ 1.0d0, 1.001370076d0, 1.0d0, 1.001150096d0 /) + red_params(11, 14, :) = (/ 1.0d0, 1.002972346d0, 1.0d0, 1.002229938d0 /) + red_params(11, 15, :) = (/ 1.0d0, 1.159131722d0, 1.0d0, 3.169143057d0 /) + red_params(11, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(11, 17, :) = (/ 1.0d0, 1.190354273d0, 1.0d0, 1.256123503d0 /) + red_params(11, 18, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(11, 19, :) = (/ 0.828967164d0, 1.087956749d0, 0.988937417d0, 1.013453092d0 /) + red_params(11, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(11, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(12, 13, :) = (/ 1.0d0, 1.001357085d0, 1.0d0, 1.000235044d0 /) + red_params(12, 14, :) = (/ 1.0d0, 1.002553544d0, 1.0d0, 1.007186267d0 /) + red_params(12, 15, :) = (/ 1.0d0, 1.305249405d0, 1.0d0, 2.191555216d0 /) + red_params(12, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(12, 17, :) = (/ 1.0d0, 1.219206702d0, 1.0d0, 1.276565536d0 /) + red_params(12, 18, :) = (/ 1.0d0, 0.599484191d0, 1.0d0, 0.662072469d0 /) + red_params(12, 19, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(12, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(12, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(13, 14, :) = (/ 1.0d0, 1.000810520d0, 1.0d0, 1.000182392d0 /) + red_params(13, 15, :) = (/ 1.0d0, 1.342647661d0, 1.0d0, 2.234354040d0 /) + red_params(13, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(13, 17, :) = (/ 1.0d0, 1.252151449d0, 1.0d0, 1.294070556d0 /) + red_params(13, 18, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(13, 19, :) = (/ 1.0d0, 1.082905109d0, 1.0d0, 1.086557826d0 /) + red_params(13, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(13, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(14, 15, :) = (/ 1.695358382d0, 1.120233729d0, 1.064818089d0, 3.786003724d0 /) + red_params(14, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(14, 17, :) = (/ 1.0d0, 0.870184960d0, 1.049594632d0, 1.803567587d0 /) + red_params(14, 18, :) = (/ 1.0d0, 0.551405318d0, 0.897162268d0, 0.740416402d0 /) + red_params(14, 19, :) = (/ 0.975187766d0, 1.171714677d0, 0.973091413d0, 1.103693489d0 /) + red_params(14, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(14, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(15, 16, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(15, 17, :) = (/ 1.0d0, 1.121416201d0, 1.0d0, 1.377504607d0 /) + red_params(15, 18, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(15, 19, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(15, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(15, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(16, 17, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(16, 18, :) = (/ 1.0d0, 1.143174289d0, 1.0d0, 0.964767932d0 /) + red_params(16, 19, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(16, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(16, 21, :) = (/ 0.999746847d0, 0.993907223d0, 1.000023103d0, 0.990430423d0 /) + red_params(17, 18, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(17, 19, :) = (/ 0.795660392d0, 1.101731308d0, 1.025536736d0, 1.022749748d0 /) + red_params(17, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(17, 21, :) = (/ 1.0d0, 1.159720623d0, 1.0d0, 0.954215746d0 /) + red_params(18, 19, :) = (/ 1.0d0, 1.014832832d0, 1.0d0, 0.940587083d0 /) + red_params(18, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(18, 21, :) = (/ 1.0d0, 1.038993495d0, 1.0d0, 1.070941866d0 /) + red_params(19, 20, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(19, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + red_params(20, 21, :) = (/ 1.0d0, 1.0d0, 1.0d0, 1.0d0 /) + + do i = 1, N - 1 + do j = i + 1, N + Bv(i, j) = red_params(i, j, 1) + Gv(i, j) = red_params(i, j, 2) + Bt(i, j) = red_params(i, j, 3) + Gt(i, j) = red_params(i, j, 4) + + Bv(j, i) = 1.d0 / Bv(i, j) + Gv(j, i) = Gv(i, j) + Bt(j, i) = 1.d0 / Bt(i, j) + Gt(j, i) = Gt(i, j) + end do + end do + + noik(1, 1) = 0.57335704239162d0 + noik(1, 2) = - 0.16760687523730d1 + noik(1, 3) = 0.23405291834916d0 + noik(1, 4) = - 0.21947376343441d0 + noik(1, 5) = 0.16369201404128d-1 + noik(1, 6) = 0.15004406389280d-1 + noik(1, 7) = 0.98990489492918d-1 + noik(1, 8) = 0.58382770929055d0 + noik(1, 9) = - 0.74786867560390d0 + noik(1, 10) = 0.30033302857974d0 + noik(1, 11) = 0.20985543806568d0 + noik(1, 12) = - 0.18590151133061d-1 + noik(1, 13) = - 0.15782558339049d0 + noik(1, 14) = 0.12716735220791d0 + noik(1, 15) = - 0.32019743894346d-1 + noik(1, 16) = - 0.68049729364536d-1 + noik(1, 17) = 0.24291412853736d-1 + noik(1, 18) = 0.51440451639444d-2 + noik(1, 19) = - 0.19084949733532d-1 + noik(1, 20) = 0.55229677241291d-2 + noik(1, 21) = - 0.44197392976085d-2 + noik(1, 22) = 0.40061416708429d-1 + noik(1, 23) = - 0.33752085907575d-1 + noik(1, 24) = - 0.25127658213357d-2 + + noik(2, 1) = 0.59889711801201d0 + noik(2, 2) = - 0.16941557480731d1 + noik(2, 3) = 0.24579736191718d0 + noik(2, 4) = - 0.23722456755175d0 + noik(2, 5) = 0.17954918715141d-1 + noik(2, 6) = 0.14592875720215d-1 + noik(2, 7) = 0.10008065936206d0 + noik(2, 8) = 0.73157115385532d0 + noik(2, 9) = - 0.88372272336366d0 + noik(2, 10) = 0.31887660246708d0 + noik(2, 11) = 0.20766491728799d0 + noik(2, 12) = - 0.19379315454158d-1 + noik(2, 13) = - 0.16936641554983d0 + noik(2, 14) = 0.13546846041701d0 + noik(2, 15) = - 0.33066712095307d-1 + noik(2, 16) = - 0.60690817018557d-1 + noik(2, 17) = 0.12797548292871d-1 + noik(2, 18) = 0.58743664107299d-2 + noik(2, 19) = - 0.18451951971969d-1 + noik(2, 20) = 0.47226622042472d-2 + noik(2, 21) = - 0.52024079680599d-2 + noik(2, 22) = 0.43563505956635d-1 + noik(2, 23) = - 0.36251690750939d-1 + noik(2, 24) = - 0.28974026866543d-2 + + noik(3, 1) = 0.52646564804653d0 + noik(3, 2) = - 0.14995725042592d1 + noik(3, 3) = 0.27329786733782d0 + noik(3, 4) = 0.12949500022786d0 + noik(3, 5) = 0.15404088341841d0 + noik(3, 6) = - 0.58186950946814d0 + noik(3, 7) = - 0.18022494838296d0 + noik(3, 8) = - 0.95389904072812d-1 + noik(3, 9) = - 0.80486819317679d-2 + noik(3, 10) = - 0.35547751273090d-1 + noik(3, 11) = - 0.28079014882405d0 + noik(3, 12) = - 0.82435890081677d-1 + noik(3, 13) = 0.10832427979006d-1 + noik(3, 14) = - 0.67073993161097d-2 + noik(3, 15) = - 0.46827907600524d-2 + noik(3, 16) = - 0.28359911832177d-1 + noik(3, 17) = 0.19500174744098d-1 + noik(3, 18) = - 0.21609137507166d0 + noik(3, 19) = 0.43772794926972d0 + noik(3, 20) = - 0.22130790113593d0 + noik(3, 21) = 0.15190189957331d-1 + noik(3, 22) = - 0.15380948953300d-1 + + noik(4, 1) = 0.63596780450714d0 + noik(4, 2) = - 0.17377981785459d1 + noik(4, 3) = 0.28914060926272d0 + noik(4, 4) = - 0.33714276845694d0 + noik(4, 5) = 0.22405964699561d-1 + noik(4, 6) = 0.15715424886913d-1 + noik(4, 7) = 0.11450634253745 + noik(4, 8) = 0.10612049379745d1 + noik(4, 9) = - 0.12855224439423d1 + noik(4, 10) = 0.39414630777652d0 + noik(4, 11) = 0.31390924682041d0 + noik(4, 12) = - 0.21592277117247d-1 + noik(4, 13) = - 0.21723666564905d0 + noik(4, 14) = - 0.28999574439489d0 + noik(4, 15) = 0.42321173025732d0 + noik(4, 16) = 0.46434100259260d-1 + noik(4, 17) = - 0.13138398329741d0 + noik(4, 18) = 0.11492850364368d-1 + noik(4, 19) = - 0.33387688429909d-1 + noik(4, 20) = 0.15183171583644d-1 + noik(4, 21) = - 0.47610805647657d-2 + noik(4, 22) = 0.46917166277885d-1 + noik(4, 23) = - 0.39401755804649d-1 + noik(4, 24) = - 0.32569956247611d-2 + + noik(5, 1) = 0.10403973107358d1 + noik(5, 2) = - 0.28318404081403d1 + noik(5, 3) = 0.84393809606294d0 + noik(5, 4) = - 0.76559591850023d-1 + noik(5, 5) = 0.94697373057280d-1 + noik(5, 6) = 0.24796475497006d-3 + noik(5, 7) = 0.27743760422870d0 + noik(5, 8) = - 0.43846000648377d-1 + noik(5, 9) = - 0.26991064784350d0 + noik(5, 10) = - 0.69313413089860d-1 + noik(5, 11) = - 0.29632145981653d-1 + noik(5, 12) = 0.14040126751380d-1 + + noik(6, 1) = 0.10626277411455d1 + noik(6, 2) = - 0.28620951828350d1 + noik(6, 3) = 0.88738233403777d0 + noik(6, 4) = - 0.12570581155345d0 + noik(6, 5) = 0.10286308708106d0 + noik(6, 6) = 0.25358040602654d-3 + noik(6, 7) = 0.32325200233982d0 + noik(6, 8) = - 0.37950761057432d-1 + noik(6, 9) = - 0.32534802014452d0 + noik(6, 10) = - 0.79050969051011d-1 + noik(6, 11) = - 0.20636720547775d-1 + noik(6, 12) = 0.57053809334750d-2 + + noik(7, 1) = 0.10429331589100d1 + noik(7, 2) = - 0.28184272548892d1 + noik(7, 3) = 0.86176232397850d0 + noik(7, 4) = - 0.10613619452487d0 + noik(7, 5) = 0.98615749302134d-1 + noik(7, 6) = 0.23948208682322d-3 + noik(7, 7) = 0.30330004856950d0 + noik(7, 8) = - 0.41598156135099d-1 + noik(7, 9) = - 0.29991937470058d0 + noik(7, 10) = - 0.80369342764109d-1 + noik(7, 11) = - 0.29761373251151d-1 + noik(7, 12) = 0.13059630303140d-1 + + noik(8, 1) = 0.10968643098001d1 + noik(8, 2) = - 0.29988888298061d1 + noik(8, 3) = 0.99516886799212d0 + noik(8, 4) = - 0.16170708558539d0 + noik(8, 5) = 0.11334460072775d0 + noik(8, 6) = 0.26760595150748d-3 + noik(8, 7) = 0.40979881986931d0 + noik(8, 8) = - 0.40876423083075d-1 + noik(8, 9) = - 0.38169482469447d0 + noik(8, 10) = - 0.10931956843993d0 + noik(8, 11) = - 0.32073223327990d-1 + noik(8, 12) = 0.16877016216975d-1 + + noik(9, 1) = 0.10963d1 + noik(9, 2) = - 0.30402d1 + noik(9, 3) = 0.10317d1 + noik(9, 4) = - 0.15410d0 + noik(9, 5) = 0.11535d0 + noik(9, 6) = 0.29809d-3 + noik(9, 7) = 0.39571d0 + noik(9, 8) = - 0.45881d-1 + noik(9, 9) = - 0.35804d0 + noik(9, 10) = - 0.10107d0 + noik(9, 11) = - 0.35484d-1 + noik(9, 12) = 0.18156d-1 + + noik(10, 1) = 0.10553238013661d1 + noik(10, 2) = - 0.26120615890629d1 + noik(10, 3) = 0.76613882967260d0 + noik(10, 4) = - 0.29770320622459d0 + noik(10, 5) = 0.11879907733358d0 + noik(10, 6) = 0.27922861062617d-3 + noik(10, 7) = 0.46347589844105d0 + noik(10, 8) = 0.11433196980297d-1 + noik(10, 9) = - 0.48256968738131d0 + noik(10, 10) = - 0.93750558924659d-1 + noik(10, 11) = - 0.67273247155994d-2 + noik(10, 12) = - 0.51141583585428d-2 + + noik(11, 1) = 0.10543747645262d1 + noik(11, 2) = - 0.26500681506144d1 + noik(11, 3) = 0.81730047827543d0 + noik(11, 4) = - 0.30451391253428d0 + noik(11, 5) = 0.12253868710800d0 + noik(11, 6) = 0.27266472743928d-3 + noik(11, 7) = 0.49865825681670d0 + noik(11, 8) = - 0.71432815084176d-3 + noik(11, 9) = - 0.54236895525450d0 + noik(11, 10) = - 0.13801821610756d0 + noik(11, 11) = - 0.61595287380011d-2 + noik(11, 12) = 0.48602510393022d-3 + + noik(12, 1) = 0.10722544875633d1 + noik(12, 2) = - 0.24632951172003d1 + noik(12, 3) = 0.65386674054928d0 + noik(12, 4) = - 0.36324974085628d0 + noik(12, 5) = 0.12713269626764d0 + noik(12, 6) = 0.30713572777930d-3 + noik(12, 7) = 0.52656856987540d0 + noik(12, 8) = 0.19362862857653d-1 + noik(12, 9) = - 0.58939426849155d0 + noik(12, 10) = - 0.14069963991934d0 + noik(12, 11) = - 0.78966330500036d-2 + noik(12, 12) = 0.33036597968109d-2 + + noik(13, 1) = 0.11151d1 + noik(13, 2) = - 0.27020d1 + noik(13, 3) = 0.83416d0 + noik(13, 4) = - 0.38828d0 + noik(13, 5) = 0.13760d0 + noik(13, 6) = 0.28185d-3 + noik(13, 7) = 0.62037d0 + noik(13, 8) = 0.15847d-1 + noik(13, 9) = - 0.61726d0 + noik(13, 10) = - 0.15043d0 + noik(13, 11) = - 0.12982d-1 + noik(13, 12) = 0.44325d-2 + + noik(14, 1) = 0.10461d1 + noik(14, 2) = - 0.24807d1 + noik(14, 3) = 0.74372d0 + noik(14, 4) = - 0.52579d0 + noik(14, 5) = 0.15315d0 + noik(14, 6) = 0.32865d-3 + noik(14, 7) = 0.84178d0 + noik(14, 8) = 0.55424d-1 + noik(14, 9) = - 0.73555d0 + noik(14, 10) = - 0.18507d0 + noik(14, 11) = - 0.20775d-1 + noik(14, 12) = 0.12335d-1 + + noik(15, 1) = 0.53579928451252d1 + noik(15, 2) = - 0.62050252530595d1 + noik(15, 3) = 0.13830241327086d0 + noik(15, 4) = - 0.71397954896129d-1 + noik(15, 5) = 0.15474053959733d-1 + noik(15, 6) = - 0.14976806405771d0 + noik(15, 7) = - 0.26368723988451d-1 + noik(15, 8) = 0.56681303156066d-1 + noik(15, 9) = - 0.60063958030436d-1 + noik(15, 10) = - 0.45043942027132d0 + noik(15, 11) = 0.42478840244500d0 + noik(15, 12) = - 0.21997640827139d-1 + noik(15, 13) = - 0.10499521374530d-1 + noik(15, 14) = - 0.28955902866816d-2 + + noik(16, 1) = 0.88878286369701d0 + noik(16, 2) = - 0.24879433312148d1 + noik(16, 3) = 0.59750190775886d0 + noik(16, 4) = 0.96501817061881d-2 + noik(16, 5) = 0.71970428712770d-1 + noik(16, 6) = 0.22337443000195d-3 + noik(16, 7) = 0.18558686391474d0 + noik(16, 8) = - 0.38129368035760d-1 + noik(16, 9) = - 0.15352245383006d0 + noik(16, 10) = - 0.26726814910919d-1 + noik(16, 11) = - 0.25675298677127d-1 + noik(16, 12) = 0.95714302123668d-2 + + noik(17, 1) = 0.90554d0 + noik(17, 2) = - 0.24515d1 + noik(17, 3) = 0.53149d0 + noik(17, 4) = 0.24173d-1 + noik(17, 5) = 0.72156d-1 + noik(17, 6) = 0.18818d-3 + noik(17, 7) = 0.19405d0 + noik(17, 8) = - 0.43268d-1 + noik(17, 9) = - 0.12778d0 + noik(17, 10) = - 0.27896d-1 + noik(17, 11) = - 0.34154d-1 + noik(17, 12) = 0.16329d-1 + + noik(18, 1) = 0.82728408749586d0 + noik(18, 2) = - 0.18602220416584d1 + noik(18, 3) = - 0.11199009613744d1 + noik(18, 4) = 0.15635753976056d0 + noik(18, 5) = 0.87375844859025d0 + noik(18, 6) = - 0.36674403715731d0 + noik(18, 7) = 0.53987893432436d-1 + noik(18, 8) = 0.10957690214499d1 + noik(18, 9) = 0.53213037828563d-1 + noik(18, 10) = 0.13050533930825d-1 + noik(18, 11) = - 0.41079520434476d0 + noik(18, 12) = 0.14637443344120d0 + noik(18, 13) = - 0.55726838623719d-1 + noik(18, 14) = - 0.11201774143800d-1 + noik(18, 15) = - 0.66062758068099d-2 + noik(18, 16) = 0.46918522004538d-2 + + noik(19, 1) = 0.87641d0 + noik(19, 2) = - 0.20367d1 + noik(19, 3) = 0.21634d0 + noik(19, 4) = - 0.50199d-1 + noik(19, 5) = 0.66994d-1 + noik(19, 6) = 0.19076d-3 + noik(19, 7) = 0.20227d0 + noik(19, 8) = - 0.45348d-2 + noik(19, 9) = - 0.22230d0 + noik(19, 10) = - 0.34714d-1 + noik(19, 11) = - 0.14885d-1 + noik(19, 12) = 0.74154d-2 + + noik(20, 1) = - 0.45579024006737d0 + noik(20, 2) = 0.12516390754925d1 + noik(20, 3) = - 0.15438231650621d1 + noik(20, 4) = 0.20467489707221d-1 + noik(20, 5) = - 0.34476212380781d0 + noik(20, 6) = - 0.20858459512787d-1 + noik(20, 7) = 0.16227414711778d-1 + noik(20, 8) = - 0.57471818200892d-1 + noik(20, 9) = 0.19462416430715d-1 + noik(20, 10) = - 0.33295680123020d-1 + noik(20, 11) = - 0.10863577372367d-1 + noik(20, 12) = - 0.22173365245954d-1 + + noik(21, 1) = 0.85095714803969d0 + noik(21, 2) = - 0.24003222943480d1 + noik(21, 3) = 0.54127841476466d0 + noik(21, 4) = 0.16919770692538d-1 + noik(21, 5) = 0.68825965019035d-1 + noik(21, 6) = 0.21428032815338d-3 + noik(21, 7) = 0.17429895321992d0 + noik(21, 8) = - 0.33654495604194d-1 + noik(21, 9) = - 0.13526799857691d0 + noik(21, 10) = - 0.16387350791552d-1 + noik(21, 11) = - 0.24987666851475d-1 + noik(21, 12) = 0.88769204815709d-2 + + coik(3, 5) = 1 + coik(3, 6) = 1 + coik(3, 7) = 1 + coik(3, 8) = 1 + coik(3, 9) = 1 + coik(3, 10) = 1 + coik(3, 11) = 2 + coik(3, 12) = 2 + coik(3, 13) = 3 + coik(3, 14) = 3 + coik(3, 15) = 3 + coik(3, 16) = 3 + coik(3, 17) = 3 + coik(3, 18) = 5 + coik(3, 19) = 5 + coik(3, 20) = 5 + coik(3, 21) = 6 + coik(3, 22) = 6 + + coik(15, 6) = 1 + coik(15, 7) = 1 + coik(15, 8) = 1 + coik(15, 9) = 1 + coik(15, 10) = 2 + coik(15, 11) = 2 + coik(15, 12) = 3 + coik(15, 13) = 3 + coik(15, 14) = 5 + + coik(18, 8) = 1 + coik(18, 9) = 1 + coik(18, 10) = 1 + coik(18, 11) = 2 + coik(18, 12) = 2 + coik(18, 13) = 2 + coik(18, 14) = 3 + coik(18, 15) = 5 + coik(18, 16) = 5 + + coik(20, 5) = 1 + coik(20, 6) = 1 + coik(20, 7) = 1 + coik(20, 8) = 1 + coik(20, 9) = 1 + coik(20, 10) = 2 + coik(20, 11) = 3 + coik(20, 12) = 3 + + tmp1 = (/ 1, 2, 4 /) + + do i = 1, size(tmp1) + k = tmp1(i) + doik(k, 1) = 1 + doik(k, 2) = 1 + doik(k, 3) = 2 + doik(k, 4) = 2 + doik(k, 5) = 4 + doik(k, 6) = 4 + doik(k, 7) = 1 + doik(k, 8) = 1 + doik(k, 9) = 1 + doik(k, 10) = 2 + doik(k, 11) = 3 + doik(k, 12) = 6 + doik(k, 13) = 2 + doik(k, 14) = 3 + doik(k, 15) = 3 + doik(k, 16) = 4 + doik(k, 17) = 4 + doik(k, 18) = 2 + doik(k, 19) = 3 + doik(k, 20) = 4 + doik(k, 21) = 5 + doik(k, 22) = 6 + doik(k, 23) = 6 + doik(k, 24) = 7 + + toik(k, 1) = 0.125d0 + toik(k, 2) = 1.125d0 + toik(k, 3) = 0.375d0 + toik(k, 4) = 1.125d0 + toik(k, 5) = 0.625d0 + toik(k, 6) = 1.500d0 + toik(k, 7) = 0.625d0 + toik(k, 8) = 2.625d0 + toik(k, 9) = 2.750d0 + toik(k, 10) = 2.125d0 + toik(k, 11) = 2.000d0 + toik(k, 12) = 1.750d0 + toik(k, 13) = 4.500d0 + toik(k, 14) = 4.750d0 + toik(k, 15) = 5.000d0 + toik(k, 16) = 4.000d0 + toik(k, 17) = 4.500d0 + toik(k, 18) = 7.500d0 + toik(k, 19) = 14.000d0 + toik(k, 20) = 11.500d0 + toik(k, 21) = 26.000d0 + toik(k, 22) = 28.000d0 + toik(k, 23) = 30.000d0 + toik(k, 24) = 16.000d0 + + coik(k, 7) = 1 + coik(k, 8) = 1 + coik(k, 9) = 1 + coik(k, 10) = 1 + coik(k, 11) = 1 + coik(k, 12) = 1 + coik(k, 13) = 2 + coik(k, 14) = 2 + coik(k, 15) = 2 + coik(k, 16) = 2 + coik(k, 17) = 2 + coik(k, 18) = 3 + coik(k, 19) = 3 + coik(k, 20) = 3 + coik(k, 21) = 6 + coik(k, 22) = 6 + coik(k, 23) = 6 + coik(k, 24) = 6 + + Kpol(k) = 6 + Kexp(k) = 18 + + end do + + tmp2 = (/ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21 /) + + do i = 1, size(tmp2) + k = tmp2(i) + + coik(k, 7) = 1 + coik(k, 8) = 1 + coik(k, 9) = 2 + coik(k, 10) = 2 + coik(k, 11) = 3 + coik(k, 12) = 3 + + doik(k, 1) = 1 + doik(k, 2) = 1 + doik(k, 3) = 1 + doik(k, 4) = 2 + doik(k, 5) = 3 + doik(k, 6) = 7 + doik(k, 7) = 2 + doik(k, 8) = 5 + doik(k, 9) = 1 + doik(k, 10) = 4 + doik(k, 11) = 3 + doik(k, 12) = 4 + + toik(k, 1) = 0.250d0 + toik(k, 2) = 1.125d0 + toik(k, 3) = 1.500d0 + toik(k, 4) = 1.375d0 + toik(k, 5) = 0.250d0 + toik(k, 6) = 0.875d0 + toik(k, 7) = 0.625d0 + toik(k, 8) = 1.750d0 + toik(k, 9) = 3.625d0 + toik(k, 10) = 3.625d0 + toik(k, 11) = 14.500d0 + toik(k, 12) = 12.000d0 + + Kpol(k) = 6 + Kexp(k) = 6 + + end do + + Kpol(3) = 4 + Kexp(3) = 18 + + Kpol(15) = 5 + Kexp(15) = 9 + + Kpol(18) = 7 + Kexp(18) = 9 + + Kpol(20) = 4 + Kexp(20) = 8 + + doik(20, 1) = 1 + doik(20, 2) = 1 + doik(20, 3) = 1 + doik(20, 4) = 4 + doik(20, 5) = 1 + doik(20, 6) = 3 + doik(20, 7) = 5 + doik(20, 8) = 5 + doik(20, 9) = 5 + doik(20, 10) = 2 + doik(20, 11) = 1 + doik(20, 12) = 2 + + toik(20, 1) = 0.000d0 + toik(20, 2) = 0.125d0 + toik(20, 3) = 0.750d0 + toik(20, 4) = 1.000d0 + toik(20, 5) = 0.750d0 + toik(20, 6) = 2.625d0 + toik(20, 7) = 0.125d0 + toik(20, 8) = 1.250d0 + toik(20, 9) = 2.000d0 + toik(20, 10) = 1.000d0 + toik(20, 11) = 4.500d0 + toik(20, 12) = 5.000d0 + + doik(18, 1) = 1 + doik(18, 2) = 1 + doik(18, 3) = 1 + doik(18, 4) = 2 + doik(18, 5) = 2 + doik(18, 6) = 3 + doik(18, 7) = 4 + doik(18, 8) = 1 + doik(18, 9) = 5 + doik(18, 10) = 5 + doik(18, 11) = 1 + doik(18, 12) = 2 + doik(18, 13) = 4 + doik(18, 14) = 4 + doik(18, 15) = 1 + doik(18, 16) = 1 + + toik(18, 1) = 0.500d0 + toik(18, 2) = 1.250d0 + toik(18, 3) = 1.875d0 + toik(18, 4) = 0.125d0 + toik(18, 5) = 1.500d0 + toik(18, 6) = 1.000d0 + toik(18, 7) = 0.750d0 + toik(18, 8) = 1.500d0 + toik(18, 9) = 0.625d0 + toik(18, 10) = 2.625d0 + toik(18, 11) = 5.000d0 + toik(18, 12) = 4.000d0 + toik(18, 13) = 4.500d0 + toik(18, 14) = 3.000d0 + toik(18, 15) = 4.000d0 + toik(18, 16) = 6.000d0 + + doik(15, 1) = 1 + doik(15, 2) = 1 + doik(15, 3) = 2 + doik(15, 4) = 2 + doik(15, 5) = 4 + doik(15, 6) = 1 + doik(15, 7) = 5 + doik(15, 8) = 5 + doik(15, 9) = 5 + doik(15, 10) = 1 + doik(15, 11) = 1 + doik(15, 12) = 2 + doik(15, 13) = 5 + doik(15, 14) = 1 + + toik(15, 1) = 0.500d0 + toik(15, 2) = 0.625d0 + toik(15, 3) = 0.375d0 + toik(15, 4) = 0.625d0 + toik(15, 5) = 1.125d0 + toik(15, 6) = 2.625d0 + toik(15, 7) = 0.000d0 + toik(15, 8) = 0.250d0 + toik(15, 9) = 1.375d0 + toik(15, 10) = 4.000d0 + toik(15, 11) = 4.250d0 + toik(15, 12) = 5.000d0 + toik(15, 13) = 8.000d0 + toik(15, 14) = 8.000d0 + + doik(3, 1) = 1 + doik(3, 2) = 1 + doik(3, 3) = 2 + doik(3, 4) = 3 + doik(3, 5) = 3 + doik(3, 6) = 3 + doik(3, 7) = 4 + doik(3, 8) = 5 + doik(3, 9) = 6 + doik(3, 10) = 6 + doik(3, 11) = 1 + doik(3, 12) = 4 + doik(3, 13) = 1 + doik(3, 14) = 1 + doik(3, 15) = 3 + doik(3, 16) = 3 + doik(3, 17) = 4 + doik(3, 18) = 5 + doik(3, 19) = 5 + doik(3, 20) = 5 + doik(3, 21) = 5 + doik(3, 22) = 5 + + toik(3, 1) = 0.000d0 + toik(3, 2) = 1.250d0 + toik(3, 3) = 1.625d0 + toik(3, 4) = 0.375d0 + toik(3, 5) = 0.375d0 + toik(3, 6) = 1.375d0 + toik(3, 7) = 1.125d0 + toik(3, 8) = 1.375d0 + toik(3, 9) = 0.125d0 + toik(3, 10) = 1.625d0 + toik(3, 11) = 3.750d0 + toik(3, 12) = 3.500d0 + toik(3, 13) = 7.500d0 + toik(3, 14) = 8.000d0 + toik(3, 15) = 6.000d0 + toik(3, 16) = 16.000d0 + toik(3, 17) = 11.000d0 + toik(3, 18) = 24.000d0 + toik(3, 19) = 26.000d0 + toik(3, 20) = 28.000d0 + toik(3, 21) = 24.000d0 + toik(3, 22) = 26.000d0 + + ! Departure function parameters + + dij(1, 2, 1) = 1 + dij(1, 2, 2) = 4 + dij(1, 2, 3) = 1 + dij(1, 2, 4) = 2 + dij(1, 2, 5) = 2 + dij(1, 2, 6) = 2 + dij(1, 2, 7) = 2 + dij(1, 2, 8) = 2 + dij(1, 2, 9) = 3 + + tij(1, 2, 1) = 0.000d0 + tij(1, 2, 2) = 1.850d0 + tij(1, 2, 3) = 7.850d0 + tij(1, 2, 4) = 5.400d0 + tij(1, 2, 5) = 0.000d0 + tij(1, 2, 6) = 0.750d0 + tij(1, 2, 7) = 2.800d0 + tij(1, 2, 8) = 4.450d0 + tij(1, 2, 9) = 4.250d0 + + nij(1, 2, 1) = - 0.98038985517335d-2 + nij(1, 2, 2) = 0.42487270143005d-3 + nij(1, 2, 3) = - 0.34800214576142d-1 + nij(1, 2, 4) = - 0.13333813013896d0 + nij(1, 2, 5) = - 0.11993694974627d-1 + nij(1, 2, 6) = 0.69243379775168d-1 + nij(1, 2, 7) = - 0.31022508148249d0 + nij(1, 2, 8) = 0.24495491753226d0 + nij(1, 2, 9) = 0.22369816716981d0 + + ethaij(1, 2, 3) = 1.000d0 + ethaij(1, 2, 4) = 1.000d0 + ethaij(1, 2, 5) = 0.250d0 + ethaij(1, 2, 6) = 0.000d0 + ethaij(1, 2, 7) = 0.000d0 + ethaij(1, 2, 8) = 0.000d0 + ethaij(1, 2, 9) = 0.000d0 + + epsij(1, 2, 3) = 0.5d0 + epsij(1, 2, 4) = 0.5d0 + epsij(1, 2, 5) = 0.5d0 + epsij(1, 2, 6) = 0.5d0 + epsij(1, 2, 7) = 0.5d0 + epsij(1, 2, 8) = 0.5d0 + epsij(1, 2, 9) = 0.5d0 + + betaij(1, 2, 3) = 1.000d0 + betaij(1, 2, 4) = 1.000d0 + betaij(1, 2, 5) = 2.500d0 + betaij(1, 2, 6) = 3.000d0 + betaij(1, 2, 7) = 3.000d0 + betaij(1, 2, 8) = 3.000d0 + betaij(1, 2, 9) = 3.000d0 + + gammaij(1, 2, 3) = 0.5d0 + gammaij(1, 2, 4) = 0.5d0 + gammaij(1, 2, 5) = 0.5d0 + gammaij(1, 2, 6) = 0.5d0 + gammaij(1, 2, 7) = 0.5d0 + gammaij(1, 2, 8) = 0.5d0 + gammaij(1, 2, 9) = 0.5d0 + + dij(1, 3, 1) = 1 + dij(1, 3, 2) = 2 + dij(1, 3, 3) = 3 + dij(1, 3, 4) = 1 + dij(1, 3, 5) = 2 + dij(1, 3, 6) = 3 + + tij(1, 3, 1) = 2.600d0 + tij(1, 3, 2) = 1.950d0 + tij(1, 3, 3) = 0.000d0 + tij(1, 3, 4) = 3.950d0 + tij(1, 3, 5) = 7.950d0 + tij(1, 3, 6) = 8.000d0 + + nij(1, 3, 1) = - 0.10859387354942d0 + nij(1, 3, 2) = 0.80228576727389d-1 + nij(1, 3, 3) = - 0.93303985115717d-2 + nij(1, 3, 4) = 0.40989274005848d-1 + nij(1, 3, 5) = - 0.24338019772494d0 + nij(1, 3, 6) = 0.23855347281124d0 + + ethaij(1, 3, 4) = 1.000d0 + ethaij(1, 3, 5) = 0.500d0 + ethaij(1, 3, 6) = 0.000d0 + + epsij(1, 3, 4) = 0.5d0 + epsij(1, 3, 5) = 0.5d0 + epsij(1, 3, 6) = 0.5d0 + + betaij(1, 3, 4) = 1.000d0 + betaij(1, 3, 5) = 2.000d0 + betaij(1, 3, 6) = 3.000d0 + + gammaij(1, 3, 4) = 0.5d0 + gammaij(1, 3, 5) = 0.5d0 + gammaij(1, 3, 6) = 0.5d0 + + dij(1, 4, 1) = 3 + dij(1, 4, 2) = 4 + dij(1, 4, 3) = 1 + dij(1, 4, 4) = 2 + dij(1, 4, 5) = 2 + dij(1, 4, 6) = 2 + dij(1, 4, 7) = 2 + dij(1, 4, 8) = 2 + dij(1, 4, 9) = 2 + dij(1, 4, 10) = 3 + dij(1, 4, 11) = 3 + dij(1, 4, 12) = 3 + + tij(1, 4, 1) = 0.650d0 + tij(1, 4, 2) = 1.550d0 + tij(1, 4, 3) = 3.100d0 + tij(1, 4, 4) = 5.900d0 + tij(1, 4, 5) = 7.050d0 + tij(1, 4, 6) = 3.350d0 + tij(1, 4, 7) = 1.200d0 + tij(1, 4, 8) = 5.800d0 + tij(1, 4, 9) = 2.700d0 + tij(1, 4, 10) = 0.450d0 + tij(1, 4, 11) = 0.550d0 + tij(1, 4, 12) = 1.950d0 + + nij(1, 4, 1) = - 0.80926050298746d-3 + nij(1, 4, 2) = - 0.75381925080059d-3 + nij(1, 4, 3) = - 0.41618768891219d-1 + nij(1, 4, 4) = - 0.23452173681569d0 + nij(1, 4, 5) = 0.14003840584586d0 + nij(1, 4, 6) = 0.63281744807738d-1 + nij(1, 4, 7) = - 0.34660425848809d-1 + nij(1, 4, 8) = - 0.23918747334251d0 + nij(1, 4, 9) = 0.19855255066891d-2 + nij(1, 4, 10) = 0.61777746171555d1 + nij(1, 4, 11) = - 0.69575358271105d1 + nij(1, 4, 12) = 0.10630185306388d1 + + ethaij(1, 4, 3) = 1.000d0 + ethaij(1, 4, 4) = 1.000d0 + ethaij(1, 4, 5) = 1.000d0 + ethaij(1, 4, 6) = 0.875d0 + ethaij(1, 4, 7) = 0.750d0 + ethaij(1, 4, 8) = 0.500d0 + ethaij(1, 4, 9) = 0.000d0 + ethaij(1, 4, 10) = 0.000d0 + ethaij(1, 4, 11) = 0.000d0 + ethaij(1, 4, 12) = 0.000d0 + + epsij(1, 4, 3) = 0.5d0 + epsij(1, 4, 4) = 0.5d0 + epsij(1, 4, 5) = 0.5d0 + epsij(1, 4, 6) = 0.5d0 + epsij(1, 4, 7) = 0.5d0 + epsij(1, 4, 8) = 0.5d0 + epsij(1, 4, 9) = 0.5d0 + epsij(1, 4, 10) = 0.5d0 + epsij(1, 4, 11) = 0.5d0 + epsij(1, 4, 12) = 0.5d0 + + betaij(1, 4, 3) = 1.000d0 + betaij(1, 4, 4) = 1.000d0 + betaij(1, 4, 5) = 1.000d0 + betaij(1, 4, 6) = 1.250d0 + betaij(1, 4, 7) = 1.500d0 + betaij(1, 4, 8) = 2.000d0 + betaij(1, 4, 9) = 3.000d0 + betaij(1, 4, 10) = 3.000d0 + betaij(1, 4, 11) = 3.000d0 + betaij(1, 4, 12) = 3.000d0 + + gammaij(1, 4, 3) = 0.5d0 + gammaij(1, 4, 4) = 0.5d0 + gammaij(1, 4, 5) = 0.5d0 + gammaij(1, 4, 6) = 0.5d0 + gammaij(1, 4, 7) = 0.5d0 + gammaij(1, 4, 8) = 0.5d0 + gammaij(1, 4, 9) = 0.5d0 + gammaij(1, 4, 10) = 0.5d0 + gammaij(1, 4, 11) = 0.5d0 + gammaij(1, 4, 12) = 0.5d0 + + dij(1, 5, 1) = 3 + dij(1, 5, 2) = 3 + dij(1, 5, 3) = 4 + dij(1, 5, 4) = 4 + dij(1, 5, 5) = 4 + dij(1, 5, 6) = 1 + dij(1, 5, 7) = 1 + dij(1, 5, 8) = 1 + dij(1, 5, 9) = 2 + + tij(1, 5, 1) = 1.850d0 + tij(1, 5, 2) = 3.950d0 + tij(1, 5, 3) = 0.000d0 + tij(1, 5, 4) = 1.850d0 + tij(1, 5, 5) = 3.850d0 + tij(1, 5, 6) = 5.250d0 + tij(1, 5, 7) = 3.850d0 + tij(1, 5, 8) = 0.200d0 + tij(1, 5, 9) = 6.500d0 + + nij(1, 5, 1) = 0.13746429958576d-1 + nij(1, 5, 2) = - 0.74425012129552d-2 + nij(1, 5, 3) = - 0.45516600213685d-2 + nij(1, 5, 4) = - 0.54546603350237d-2 + nij(1, 5, 5) = 0.23682016824471d-2 + nij(1, 5, 6) = 0.18007763721438d0 + nij(1, 5, 7) = - 0.44773942932486d0 + nij(1, 5, 8) = 0.19327374888200d-1 + nij(1, 5, 9) = - 0.30632197804624d0 + + ethaij(1, 5, 6) = 0.250d0 + ethaij(1, 5, 7) = 0.250d0 + ethaij(1, 5, 8) = 0.000d0 + ethaij(1, 5, 9) = 0.000d0 + + epsij(1, 5, 6) = 0.5d0 + epsij(1, 5, 7) = 0.5d0 + epsij(1, 5, 8) = 0.5d0 + epsij(1, 5, 9) = 0.5d0 + + betaij(1, 5, 6) = 0.750d0 + betaij(1, 5, 7) = 1.000d0 + betaij(1, 5, 8) = 2.000d0 + betaij(1, 5, 9) = 3.000d0 + + gammaij(1, 5, 6) = 0.5d0 + gammaij(1, 5, 7) = 0.5d0 + gammaij(1, 5, 8) = 0.5d0 + gammaij(1, 5, 9) = 0.5d0 + + dij(2, 3, 1) = 2 + dij(2, 3, 2) = 3 + dij(2, 3, 3) = 1 + dij(2, 3, 4) = 1 + dij(2, 3, 5) = 1 + dij(2, 3, 6) = 2 + + tij(2, 3, 1) = 1.850d0 + tij(2, 3, 2) = 1.400d0 + tij(2, 3, 3) = 3.200d0 + tij(2, 3, 4) = 2.500d0 + tij(2, 3, 5) = 8.000d0 + tij(2, 3, 6) = 3.750d0 + + nij(2, 3, 1) = 0.28661625028399d0 + nij(2, 3, 2) = - 0.10919833861247d0 + nij(2, 3, 3) = - 0.11374032082270d1 + nij(2, 3, 4) = 0.76580544237358d0 + nij(2, 3, 5) = 0.42638000926819d-2 + nij(2, 3, 6) = 0.17673538204534d0 + + ethaij(2, 3, 3) = 0.250d0 + ethaij(2, 3, 4) = 0.250d0 + ethaij(2, 3, 5) = 0.000d0 + ethaij(2, 3, 6) = 0.000d0 + + epsij(2, 3, 3) = 0.5d0 + epsij(2, 3, 4) = 0.5d0 + epsij(2, 3, 5) = 0.5d0 + epsij(2, 3, 6) = 0.5d0 + + betaij(2, 3, 3) = 0.750d0 + betaij(2, 3, 4) = 1.000d0 + betaij(2, 3, 5) = 2.000d0 + betaij(2, 3, 6) = 3.000d0 + + gammaij(2, 3, 3) = 0.5d0 + gammaij(2, 3, 4) = 0.5d0 + gammaij(2, 3, 5) = 0.5d0 + gammaij(2, 3, 6) = 0.5d0 + + dij(2, 4, 1) = 2 + dij(2, 4, 2) = 2 + dij(2, 4, 3) = 3 + dij(2, 4, 4) = 1 + dij(2, 4, 5) = 2 + dij(2, 4, 6) = 2 + + tij(2, 4, 1) = 0.000d0 + tij(2, 4, 2) = 0.050d0 + tij(2, 4, 3) = 0.000d0 + tij(2, 4, 4) = 3.650d0 + tij(2, 4, 5) = 4.900d0 + tij(2, 4, 6) = 4.450d0 + + nij(2, 4, 1) = - 0.47376518126608d0 + nij(2, 4, 2) = 0.48961193461001d0 + nij(2, 4, 3) = - 0.57011062090535d-2 + nij(2, 4, 4) = - 0.19966820041320d0 + nij(2, 4, 5) = - 0.69411103101723d0 + nij(2, 4, 6) = 0.69226192739021d0 + + ethaij(2, 4, 4) = 1.000d0 + ethaij(2, 4, 5) = 1.000d0 + ethaij(2, 4, 6) = 0.875d0 + + epsij(2, 4, 4) = 0.5d0 + epsij(2, 4, 5) = 0.5d0 + epsij(2, 4, 6) = 0.5d0 + + betaij(2, 4, 4) = 1.000d0 + betaij(2, 4, 5) = 1.000d0 + betaij(2, 4, 6) = 1.250d0 + + gammaij(2, 4, 4) = 0.5d0 + gammaij(2, 4, 5) = 0.5d0 + gammaij(2, 4, 6) = 0.5d0 + + dij(1, 15, 1) = 1 + dij(1, 15, 2) = 3 + dij(1, 15, 3) = 3 + dij(1, 15, 4) = 4 + + tij(1, 15, 1) = 2.000d0 + tij(1, 15, 2) = - 1.000d0 + tij(1, 15, 3) = 1.750d0 + tij(1, 15, 4) = 1.400d0 + + nij(1, 15, 1) = - 0.25157134971934d0 + nij(1, 15, 2) = - 0.62203841111983d-2 + nij(1, 15, 3) = 0.88850315184396d-1 + nij(1, 15, 4) = - 0.35592212573239d-1 + + generalized_departure(1, :) = (/ 1, 6 /) + generalized_departure(2, :) = (/ 1, 7 /) + generalized_departure(3, :) = (/ 4, 5 /) + generalized_departure(4, :) = (/ 4, 6 /) + generalized_departure(5, :) = (/ 4, 7 /) + generalized_departure(6, :) = (/ 5, 6 /) + generalized_departure(7, :) = (/ 5, 7 /) + generalized_departure(8, :) = (/ 6, 7 /) + + do k = 1, 8 + i = generalized_departure(k, 1) + j = generalized_departure(k, 2) + + dij(i, j, 1) = 1 + dij(i, j, 2) = 1 + dij(i, j, 3) = 1 + dij(i, j, 4) = 2 + dij(i, j, 5) = 2 + dij(i, j, 6) = 3 + dij(i, j, 7) = 3 + dij(i, j, 8) = 4 + dij(i, j, 9) = 4 + dij(i, j, 10) = 4 + + tij(i, j, 1) = 1.000d0 + tij(i, j, 2) = 1.550d0 + tij(i, j, 3) = 1.700d0 + tij(i, j, 4) = 0.250d0 + tij(i, j, 5) = 1.350d0 + tij(i, j, 6) = 0.000d0 + tij(i, j, 7) = 1.250d0 + tij(i, j, 8) = 0.000d0 + tij(i, j, 9) = 0.700d0 + tij(i, j, 10) = 5.400d0 + + nij(i, j, 1) = 0.25574776844118d1 + nij(i, j, 2) = - 0.79846357136353d1 + nij(i, j, 3) = 0.47859131465806d1 + nij(i, j, 4) = - 0.73265392369587 + nij(i, j, 5) = 0.13805471345312d1 + nij(i, j, 6) = 0.28349603476365d0 + nij(i, j, 7) = - 0.49087385940425d0 + nij(i, j, 8) = - 0.10291888921447d0 + nij(i, j, 9) = 0.11836314681968d0 + nij(i, j, 10) = 0.55527385721943d-4 + + Kpolij(i, j) = 10 + Kexpij(i, j) = 0 + + end do + + KPolij(1, 2) = 2 + KExpij(1, 2) = 7 + + KPolij(1, 3) = 3 + KExpij(1, 3) = 3 + + KPolij(1, 4) = 2 + KExpij(1, 4) = 10 + + KPolij(1, 5) = 5 + KExpij(1, 5) = 4 + + KPolij(2, 3) = 2 + KExpij(2, 3) = 4 + + KPolij(2, 4) = 3 + KExpij(2, 4) = 3 + + KPolij(1, 15) = 4 + KExpij(1, 15) = 0 + + n0i(1, 1) = 19.597508817d0 + n0i(1, 2) = - 83.959667892d0 + n0i(1, 3) = 3.00088d0 + n0i(1, 4) = 0.76315d0 + n0i(1, 5) = 0.00460d0 + n0i(1, 6) = 8.74432d0 + n0i(1, 7) = - 4.46921d0 + + n0i(2, 1) = 11.083407489d0 + n0i(2, 2) = - 22.202102428d0 + n0i(2, 3) = 2.50031d0 + n0i(2, 4) = 0.13732d0 + n0i(2, 5) = - 0.14660d0 + n0i(2, 6) = 0.90066d0 + n0i(2, 7) = 0.0d0 + + n0i(3, 1) = 11.925152758d0 + n0i(3, 2) = - 16.118762264d0 + n0i(3, 3) = 2.50002d0 + n0i(3, 4) = 2.04452d0 + n0i(3, 5) = - 1.06044d0 + n0i(3, 6) = 2.03366d0 + n0i(3, 7) = 0.01393d0 + + n0i(4, 1) = 24.675437527d0 + n0i(4, 2) = - 77.425313760d0 + n0i(4, 3) = 3.00263d0 + n0i(4, 4) = 4.33939d0 + n0i(4, 5) = 1.23722d0 + n0i(4, 6) = 13.19740d0 + n0i(4, 7) = - 6.01989d0 + + n0i(5, 1) = 31.602908195d0 + n0i(5, 2) = - 84.463284382d0 + n0i(5, 3) = 3.02939d0 + n0i(5, 4) = 6.60569d0 + n0i(5, 5) = 3.19700d0 + n0i(5, 6) = 19.19210d0 + n0i(5, 7) = - 8.37267d0 + + n0i(6, 1) = 20.884143364d0 + n0i(6, 2) = - 91.638478026d0 + n0i(6, 3) = 3.33944d0 + n0i(6, 4) = 9.44893d0 + n0i(6, 5) = 6.89406d0 + n0i(6, 6) = 24.46180d0 + n0i(6, 7) = 14.78240d0 + + n0i(7, 1) = 20.413726078d0 + n0i(7, 2) = - 94.467620036d0 + n0i(7, 3) = 3.06714d0 + n0i(7, 4) = 8.97575d0 + n0i(7, 5) = 5.25156d0 + n0i(7, 6) = 25.14230d0 + n0i(7, 7) = 16.13880d0 + + n0i(8, 1) = 14.536611217d0 + n0i(8, 2) = - 89.919548319d0 + n0i(8, 3) = 3.00000d0 + n0i(8, 4) = 8.95043d0 + n0i(8, 5) = 21.83600d0 + n0i(8, 6) = 33.40320d0 + n0i(8, 7) = 0.0d0 + + n0i(9, 1) = 15.449907693d0 + n0i(9, 2) = - 101.298172792d0 + n0i(9, 3) = 3.00000d0 + n0i(9, 4) = 11.76180d0 + n0i(9, 5) = 20.11010d0 + n0i(9, 6) = 33.16880d0 + n0i(9, 7) = 0.0d0 + + n0i(10, 1) = 14.345969349d0 + n0i(10, 2) = - 96.165722367d0 + n0i(10, 3) = 3.00000d0 + n0i(10, 4) = 11.69770d0 + n0i(10, 5) = 26.81420d0 + n0i(10, 6) = 38.61640d0 + n0i(10, 7) = 0.0d0 + + n0i(11, 1) = 15.063786601d0 + n0i(11, 2) = - 97.345252349d0 + n0i(11, 3) = 3.00000d0 + n0i(11, 4) = 13.72660d0 + n0i(11, 5) = 30.47070d0 + n0i(11, 6) = 43.55610d0 + n0i(11, 7) = 0.0d0 + + n0i(12, 1) = 15.864687161d0 + n0i(12, 2) = - 97.370667555d0 + n0i(12, 3) = 3.00000d0 + n0i(12, 4) = 15.68650d0 + n0i(12, 5) = 33.80290d0 + n0i(12, 6) = 48.17310d0 + n0i(12, 7) = 0.0d0 + + n0i(13, 1) = 16.313913248d0 + n0i(13, 2) = - 102.160247463d0 + n0i(13, 3) = 3.00000d0 + n0i(13, 4) = 18.02410d0 + n0i(13, 5) = 38.12350d0 + n0i(13, 6) = 53.34150d0 + n0i(13, 7) = 0.0d0 + + n0i(14, 1) = 15.870791919d0 + n0i(14, 2) = - 108.858547525d0 + n0i(14, 3) = 3.00000d0 + n0i(14, 4) = 21.00690d0 + n0i(14, 5) = 43.49310d0 + n0i(14, 6) = 58.36570d0 + n0i(14, 7) = 0.0d0 + + n0i(15, 1) = 13.796443393d0 + n0i(15, 2) = - 175.864487294d0 + n0i(15, 3) = 1.47906d0 + n0i(15, 4) = 0.95806d0 + n0i(15, 5) = 0.45444d0 + n0i(15, 6) = 1.56039d0 + n0i(15, 7) = 1.37560d0 + + n0i(16, 1) = 10.001843586d0 + n0i(16, 2) = - 14.996095135d0 + n0i(16, 3) = 2.50146d0 + n0i(16, 4) = 1.07558d0 + n0i(16, 5) = 1.01334d0 + n0i(16, 6) = 0.0d0 + n0i(16, 7) = 0.0d0 + + n0i(17, 1) = 10.813340744d0 + n0i(17, 2) = - 19.834733959d0 + n0i(17, 3) = 2.50055d0 + n0i(17, 4) = 1.02865d0 + n0i(17, 5) = 0.00493d0 + n0i(17, 6) = 0.0d0 + n0i(17, 7) = 0.0d0 + + n0i(18, 1) = 8.203520690d0 + n0i(18, 2) = - 11.996306443d0 + n0i(18, 3) = 3.00392d0 + n0i(18, 4) = 0.01059d0 + n0i(18, 5) = 0.98763d0 + n0i(18, 6) = 3.06904d0 + n0i(18, 7) = 0.0d0 + + n0i(19, 1) = 9.336197742d0 + n0i(19, 2) = - 16.266508995d0 + n0i(19, 3) = 3.00000d0 + n0i(19, 4) = 3.11942d0 + n0i(19, 5) = 1.00243d0 + n0i(19, 6) = 0.0d0 + n0i(19, 7) = 0.0d0 + + n0i(20, 1) = 13.628409737d0 + n0i(20, 2) = - 143.470759602d0 + n0i(20, 3) = 1.50000d0 + n0i(20, 4) = 0.0d0 + n0i(20, 5) = 0.0d0 + n0i(20, 6) = 0.0d0 + n0i(20, 7) = 0.0d0 + + n0i(21, 1) = 8.316631500d0 + n0i(21, 2) = - 4.946502600d0 + n0i(21, 3) = 1.50000d0 + n0i(21, 4) = 0.0d0 + n0i(21, 5) = 0.0d0 + n0i(21, 6) = 0.0d0 + n0i(21, 7) = 0.0d0 + + th0i(1, 4) = 4.306474465d0 + th0i(1, 5) = 0.936220902d0 + th0i(1, 6) = 5.577233895d0 + th0i(1, 7) = 5.722644361d0 + th0i(2, 4) = 5.251822620d0 + th0i(2, 5) = - 5.393067706d0 + th0i(2, 6) = 13.788988208d0 + th0i(2, 7) = 0.0d0 + th0i(3, 4) = 3.022758166d0 + th0i(3, 5) = - 2.844425476d0 + th0i(3, 6) = 1.589964364d0 + th0i(3, 7) = 1.121596090d0 + th0i(4, 4) = 1.831882406d0 + th0i(4, 5) = 0.731306621d0 + th0i(4, 6) = 3.378007481d0 + th0i(4, 7) = 3.508721939d0 + th0i(5, 4) = 1.297521801d0 + th0i(5, 5) = 0.543210978d0 + th0i(5, 6) = 2.583146083d0 + th0i(5, 7) = 2.777773271d0 + th0i(6, 4) = 1.101487798d0 + th0i(6, 5) = 0.431957660d0 + th0i(6, 6) = 4.502440459d0 + th0i(6, 7) = 2.124516319d0 + th0i(7, 4) = 1.074673199d0 + th0i(7, 5) = 0.485556021d0 + th0i(7, 6) = 4.671261865d0 + th0i(7, 7) = 2.191583480d0 + th0i(8, 4) = 0.380391739d0 + th0i(8, 5) = 1.789520971d0 + th0i(8, 6) = 3.777411113d0 + th0i(8, 7) = 0.0d0 + th0i(9, 4) = 0.635392636d0 + th0i(9, 5) = 1.977271641d0 + th0i(9, 6) = 4.169371131d0 + th0i(9, 7) = 0.0d0 + th0i(10, 4) = 0.359036667d0 + th0i(10, 5) = 1.691951873d0 + th0i(10, 6) = 3.596924107d0 + th0i(10, 7) = 0.0d0 + th0i(11, 4) = 0.314348398d0 + th0i(11, 5) = 1.548136560d0 + th0i(11, 6) = 3.259326458d0 + th0i(11, 7) = 0.0d0 + th0i(12, 4) = 0.279143540d0 + th0i(12, 5) = 1.431644769d0 + th0i(12, 6) = 2.973845992d0 + th0i(12, 7) = 0.0d0 + th0i(13, 4) = 0.263819696d0 + th0i(13, 5) = 1.370586158d0 + th0i(13, 6) = 2.848860483d0 + th0i(13, 7) = 0.0d0 + th0i(14, 4) = 0.267034159d0 + th0i(14, 5) = 1.353835195d0 + th0i(14, 6) = 2.833479035d0 + th0i(14, 7) = 0.0d0 + th0i(15, 4) = 6.891654113d0 + th0i(15, 5) = 9.847634830d0 + th0i(15, 6) = 49.765290750d0 + th0i(15, 7) = 50.367279301d0 + th0i(16, 4) = 14.461722565d0 + th0i(16, 5) = 7.223325463d0 + th0i(16, 6) = 0.0d0 + th0i(16, 7) = 0.0d0 + th0i(17, 4) = 11.669802800d0 + th0i(17, 5) = 5.302762306d0 + th0i(17, 6) = 0.0d0 + th0i(17, 7) = 0.0d0 + th0i(18, 4) = 0.415386589d0 + th0i(18, 5) = 1.763895929d0 + th0i(18, 6) = 3.874803739d0 + th0i(18, 7) = 0.0d0 + th0i(19, 4) = 4.914580541d0 + th0i(19, 5) = 2.270653980d0 + th0i(19, 6) = 0.0d0 + th0i(19, 7) = 0.0d0 + th0i(20, 4) = 0.0d0 + th0i(20, 5) = 0.0d0 + th0i(20, 6) = 0.0d0 + th0i(20, 7) = 0.0d0 + th0i(21, 4) = 0.0d0 + th0i(21, 5) = 0.0d0 + th0i(21, 6) = 0.0d0 + th0i(21, 7) = 0.0d0 + end subroutine original_parameters +end module yaeos__models_ar_multifluid_parameters_gerg2008 diff --git a/src/models/solvers/saturation_point.f90 b/src/models/solvers/saturation_point.f90 index 9a3d83439..475092eff 100644 --- a/src/models/solvers/saturation_point.f90 +++ b/src/models/solvers/saturation_point.f90 @@ -6,13 +6,14 @@ module yaeos__m_s_sp contains - subroutine saturation_F(model, z, X, ns, S, F, dF) + subroutine saturation_F(model, z, X, ns, S, F, dF, dPdVz, dPdVy) class(ArModel), intent(in) :: model real(pr), intent(in) :: X(:) integer, intent(in) :: ns real(pr), intent(in) :: S real(pr), intent(out) :: F(:) real(pr), optional, intent(out) :: dF(:, :) + real(pr), intent(out) :: dPdVz, dPdVy ! Variables real(pr) :: T, Vz, Vy @@ -22,14 +23,14 @@ subroutine saturation_F(model, z, X, ns, S, F, dF) real(pr) :: lnfug_z(size(model)), dlnfug_dn_z(size(model), size(model)) real(pr) :: dlnfug_dT_z(size(model)), dlnfug_dV_z(size(model)) real(pr) :: dlnfug_dP_z(size(model)) - real(pr) :: Pz, dPdTz, dPdVz, dPdn_z(size(z)) + real(pr) :: Pz, dPdTz, dPdn_z(size(z)) ! incipient phase variables real(pr) :: y(size(z)) real(pr) :: lnfug_y(size(model)), dlnfug_dn_y(size(model), size(model)) real(pr) :: dlnfug_dT_y(size(model)), dlnfug_dV_y(size(model)) real(pr) :: dlnfug_dP_y(size(model)) - real(pr) :: Py, dPdTy, dPdVy, dPdn_y(size(z)) + real(pr) :: Py, dPdTy, dPdn_y(size(z)) real(pr) :: lnPspec @@ -196,23 +197,28 @@ subroutine solve_TP(model, kind, z, X, ns, S, tol, max_iterations, its) integer, intent(in) :: max_iterations integer, intent(out) :: its - integer :: innits + integer :: nc real(pr) :: F(size(X)) real(pr) :: dF(size(X), size(X)) real(pr) :: dFdS(size(X)) real(pr) :: dx(size(X)) + nc = size(X) - 2 - - its= 0 + its = 0 + dX = 1 do while (its < max_iterations) + its = its + 1 call saturation_TP(model=model, z=z, kind=kind, X=X, ns=ns, S=S, F=F, dF=dF, dFdS=dFdS) dX = solve_system(dF, -F) + do while (maxval(abs(dX)) > 1) + dX = dX / 2 + end do + X = X + dX if (all(abs(F) < tol)) exit - its = its + 1 end do end subroutine solve_TP @@ -227,6 +233,8 @@ subroutine solve_VxVyT(model, z, X, ns, S, tol, max_iterations, its) real(pr), intent(in) :: tol integer, intent(in) :: max_iterations integer, intent(out) :: its + + real(pr) :: dPdVz, dPdVy integer :: nc real(pr) :: F(size(X)) @@ -238,7 +246,7 @@ subroutine solve_VxVyT(model, z, X, ns, S, tol, max_iterations, its) its = 0 do while (its < max_iterations) - call saturation_F(model, z, X, ns, S, F, dF) + call saturation_F(model, z, X, ns, S, F, dF, dPdVz, dPdVy) if (all(abs(F) < tol)) exit dX = solve_system(dF, -F) diff --git a/src/models/substance.f90 b/src/models/substance.f90 index cd0991fcb..585b78317 100644 --- a/src/models/substance.f90 +++ b/src/models/substance.f90 @@ -10,5 +10,6 @@ module yaeos__substance real(pr), allocatable :: tc(:) !! Critical Temperature [K] real(pr), allocatable :: pc(:) !! Critical Pressure [bar] real(pr), allocatable :: w(:) !! Acentric factor + real(pr), allocatable :: vc(:) !! Critical Volume [L/mol] end type end module \ No newline at end of file diff --git a/test/aux.f90 b/test/aux.f90 index 36309b214..c0cf8c271 100644 --- a/test/aux.f90 +++ b/test/aux.f90 @@ -16,4 +16,21 @@ function test_ok(str) character(100) :: test_ok test_ok = fg_color_green // "OK: " // str // style_reset end function + + function test_notok(str) + use stdlib_ansi, only: fg_color_red, style_reset, operator(//) + character(*), intent(in) :: str + character(100) :: test_notok + test_notok = fg_color_red // "ERROR: " // str // style_reset + end function + + subroutine assert(expr, test_name) + logical, intent(in) :: expr + character(*), intent(in) :: test_name + if (.not. expr) then + error stop test_notok(test_name) + else + print *, test_ok(test_name) + end if + end subroutine end module \ No newline at end of file diff --git a/test/fixtures/fix_models.f90 b/test/fixtures/fix_models.f90 index 403629771..19c073ce3 100644 --- a/test/fixtures/fix_models.f90 +++ b/test/fixtures/fix_models.f90 @@ -16,7 +16,7 @@ type(CubicEoS) function binary_PR76() result(eos) kij = reshape([0., 0.1, 0.1, 0.], [n, n]) lij = kij/2 eos = PengRobinson76(tc, pc, w, kij, lij) - end function + end function binary_PR76 type(CubicEoS) function binary_PR78() result(eos) use yaeos, only: PengRobinson78 @@ -31,7 +31,7 @@ type(CubicEoS) function binary_PR78() result(eos) lij = kij/2 eos = PengRobinson78(tc, pc, w, kij, lij) - end function + end function binary_PR78 type(CubicEoS) function binary_SRK() result(eos) use yaeos, only: SoaveRedlichKwong @@ -46,7 +46,7 @@ type(CubicEoS) function binary_SRK() result(eos) lij = kij/2 eos = SoaveRedlichKwong(tc, pc, w, kij, lij) - end function + end function binary_SRK type(CubicEoS) function binary_RKPR() result(eos) use yaeos, only: RKPR @@ -62,7 +62,7 @@ type(CubicEoS) function binary_RKPR() result(eos) lij = kij/2 eos = RKPR(tc, pc, w, zc, kij, lij) - end function + end function binary_RKPR type(hdPR76) function binary_PR76_hd() result(eos) use autodiff_hyperdual_pr76, only: setup, hdPR76 @@ -77,7 +77,7 @@ type(hdPR76) function binary_PR76_hd() result(eos) lij = kij/2 eos = setup(tc, pc, w, kij, lij) - end function + end function binary_PR76_hd type(TPR76) function binary_PR76_tape() result(eos) use autodiff_tapenade_pr76, only: setup_model, TPR76 @@ -92,7 +92,7 @@ type(TPR76) function binary_PR76_tape() result(eos) lij = kij/2 eos = setup_model(tc, pc, w, kij, lij) - end function + end function binary_PR76_tape type(NRTL) function binary_NRTL_tape() result(model) integer, parameter :: n = 2 @@ -113,7 +113,7 @@ type(NRTL) function binary_NRTL_tape() result(model) c(2, 1) = 0.3 model = NRTL(a, b, c) - end function + end function binary_NRTL_tape type(CubicEoS) function binary_NRTL_SRK() result(model) use yaeos, only: NRTL, SoaveRedlichKwong, pr, CubicEoS, MHV @@ -146,8 +146,8 @@ type(CubicEoS) function binary_NRTL_SRK() result(model) mixrule = MHV(ge=ge_model, q=0.593_pr, b=model%b) deallocate (model%mixrule) model%mixrule = mixrule - end function - + end function binary_NRTL_SRK + type(CubicEoS) function binary_NRTL_SRK_HV() result(model) use yaeos, only: NRTL, SoaveRedlichKwong, pr, CubicEoS, HV @@ -180,5 +180,31 @@ type(CubicEoS) function binary_NRTL_SRK_HV() result(model) mixrule%bi = model%b mixrule%del1 = model%del1 call model%set_mixrule(mixrule) - end function -end module \ No newline at end of file + end function binary_NRTL_SRK_HV + + type(CubicEoS) function multicomponent_PR(z0, zi) result(model) + use yaeos, only: PengRobinson78 + integer, parameter :: nc = 12 + real(pr), intent(out) :: z0(nc), zi(nc) + + real(pr) :: tc(nc), pc(nc), w(nc), kij(nc,nc) + z0=[0.0656,0.3711,0.0538,0.0373,0.0261,0.0187,& + 0.0218,0.1791,0.091,0.0605,0.0447,0.0302] + zi = 0*z0 + zi(1) = 1 + + tc=[304.088888888889,190.6,305.4,369.8,425.2,469.6,507.4,616.2,& + 698.9,770.4,853.1,1001.2] + pc=[73.7343491450634,45.9196083838941,48.7516547159404,42.3795504688362, & + 37.9291919470491,33.6811224489796,29.6353419746277,28.8261858797573,& + 19.3186017650303,16.5876999448428,15.2728212906784,14.6659542195256] + w= [0.228,0.008,0.098,0.152,0.193,0.251,0.296,& + 0.454,0.787,1.048,1.276,1.299] + kij = 0 + kij(1, 2) = 0.12 + kij(1, 3:) = 0.15 + kij(:, 1) = kij(1, :) + + model = PengRobinson78(tc, pc, w, kij=kij) + end function multicomponent_PR +end module fixtures_models diff --git a/test/fixtures/taperobinson.f90 b/test/fixtures/taperobinson.f90 index 936b3ec35..3f83282a3 100644 --- a/test/fixtures/taperobinson.f90 +++ b/test/fixtures/taperobinson.f90 @@ -30,7 +30,7 @@ MODULE autodiff_tapenade_pr76 procedure :: ar_b procedure :: ar_d_b procedure :: ar_d_d - procedure :: v0 => VOLUME_INITALIZER + procedure :: get_v0 => VOLUME_INITALIZER end type TPR76 CONTAINS @@ -1352,15 +1352,15 @@ SUBROUTINE AR(model, n, v, t, arval) & arg11))*(r*t) end subroutine AR - PURE FUNCTION VOLUME_INITALIZER(model, n, p, t) RESULT (v0) + PURE FUNCTION VOLUME_INITALIZER(self, n, p, t) RESULT (v0) IMPLICIT NONE - class(TPR76), INTENT(IN) :: model + class(TPR76), INTENT(IN) :: self REAL(pr), INTENT(IN) :: n(:) REAL(pr), INTENT(IN) :: p REAL(pr), INTENT(IN) :: t REAL(pr) :: v0 INTRINSIC SUM - v0 = SUM(n*model%b)/SUM(model%b) + v0 = SUM(n*self%b)/SUM(self%b) end function VOLUME_INITALIZER end module autodiff_tapenade_pr76 diff --git a/test/test_cubic_implementations.f90 b/test/test_cubic_implementations.f90 index 4c8bea449..4e4036a9a 100644 --- a/test/test_cubic_implementations.f90 +++ b/test/test_cubic_implementations.f90 @@ -1,214 +1,215 @@ module test_cubic_implementations - use yaeos__constants, only: pr - use testdrive, only: new_unittest, unittest_type, error_type, check - use auxiliar_functions, only: allclose - implicit none + use yaeos__constants, only: pr + use testdrive, only: new_unittest, unittest_type, error_type, check + use auxiliar_functions, only: allclose + implicit none - real(pr) :: absolute_tolerance = 1e-4_pr + real(pr) :: absolute_tolerance = 1e-4_pr contains - subroutine collect_suite(testsuite) - !> Collection of tests - type(unittest_type), allocatable, intent(out) :: testsuite(:) - - testsuite = [ & - new_unittest("SRK", test_srk), & - new_unittest("PR76", test_pr76), & - new_unittest("PR78", test_pr78), & - new_unittest("RKPR", test_RKPR) & - ] - end subroutine collect_suite - - subroutine test_srk(error) - use yaeos__constants, only: pr - use fixtures_models, only: binary_SRK - use yaeos, only: ArModel - type(error_type), allocatable, intent(out) :: error - - class(ArModel), allocatable :: eos - integer, parameter :: n = 2 - real(pr) :: z(n), V, T - real(pr) :: Ar, ArV, ArV2, ArT, ArTV, ArT2 - real(pr) :: Arn(n), ArVn(n), ArTn(n), Arn2(n, n) - - real(pr) :: Ar_val, ArV_val, ArV2_val, ArT_val, ArTV_val, ArT2_val - real(pr) :: Arn_val(n), ArVn_val(n), ArTn_val(n), Arn2_val(n, n) - - Ar_val = -9.4849231269705072 - ArV_val = 9.0478810077323164 - ArT_val = 3.0631941020155939E-002 - ArT2_val = -1.0589478951539604E-004 - ArV2_val = -17.255504598247207 - ArTV_val = -3.0039878324119831E-002 - Arn_val = [-14.710404803520872, -20.170975369630906] - ArVn_val = [13.488065586019152, 18.870121409429380] - ArTn_val = [5.7833039664119255E-002, 6.1888439276263030E-002] - Arn2_val(1, :) = [-11.980899399513874, -14.133993988331257] - Arn2_val(2, :) = [-14.133993988331257, -20.899890419408248] - - eos = binary_SRK() - z = [0.3, 0.7] - v = 1 - T = 150 - call eos%residual_helmholtz( & - z, V, T, Ar=Ar, ArV=ArV, ArV2=ArV2, ArT=ArT, ArTV=ArTV, & - ArT2=ArT2, Arn=Arn, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2 & - ) - - call check(error, allclose([Ar], [Ar_val], absolute_tolerance)) - call check(error, allclose([ArV], [ArV_val], absolute_tolerance)) - call check(error, allclose([ArT], [ArT_val], absolute_tolerance)) - call check(error, allclose([ArTV], [ArTV_val], absolute_tolerance)) - call check(error, allclose([ArV2], [ArV2_val], absolute_tolerance)) - call check(error, allclose([ArT2], [ArT2_val], absolute_tolerance)) - - call check(error, allclose([ArVn], [ArVn_val], absolute_tolerance)) - call check(error, allclose([ArTn], [ArTn_val], absolute_tolerance)) - call check(error, allclose([Arn2], [Arn2_val], absolute_tolerance)) - end subroutine test_srk - - subroutine test_pr76(error) - use yaeos__constants, only: pr - use fixtures_models, only: binary_PR76 - use yaeos, only: ArModel - type(error_type), allocatable, intent(out) :: error - - class(ArModel), allocatable :: eos - integer, parameter :: n = 2 - real(pr) :: z(n), V, T - real(pr) :: Ar, ArV, ArV2, ArT, ArTV, ArT2 - real(pr) :: Arn(n), ArVn(n), ArTn(n), Arn2(n, n) - - real(pr) :: Ar_val, ArV_val, ArV2_val, ArT_val, ArTV_val, ArT2_val - real(pr) :: Arn_val(n), ArVn_val(n), ArTn_val(n), Arn2_val(n, n) - - Ar_val = -9.5079213387597061 - ArV_val = 8.8348105702414230 - ArT_val = 2.5288760006412853E-002 - ArT2_val = -8.1263714911056052E-005 - ArV2_val = -16.452712169871607 - ArTV_val = -2.4354181554918298E-002 - Arn_val = [-14.760083989416412, -19.878152533126190] - ArVn_val = [12.970846906902654, 17.944940224423746] - ArTn_val = [4.7299709855544367E-002, 5.0647183777961201E-002] - Arn2_val(1, :) = [-11.697767407192650, -13.516452437750393] - Arn2_val(2, :) = [-13.516452437750393, -19.842863669307611] - - eos = binary_PR76() - z = [0.3, 0.7] - v = 1 - T = 150 - call eos%residual_helmholtz( & - z, V, T, Ar=Ar, ArV=ArV, ArV2=ArV2, ArT=ArT, ArTV=ArTV, & - ArT2=ArT2, Arn=Arn, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2 & - ) - - call check(error, allclose([Ar], [Ar_val], absolute_tolerance)) - call check(error, allclose([ArV], [ArV_val], absolute_tolerance)) - call check(error, allclose([ArT], [ArT_val], absolute_tolerance)) - call check(error, allclose([ArTV], [ArTV_val], absolute_tolerance)) - call check(error, allclose([ArV2], [ArV2_val], absolute_tolerance)) - call check(error, allclose([ArT2], [ArT2_val], absolute_tolerance)) - - call check(error, allclose([ArVn], [ArVn_val], absolute_tolerance)) - call check(error, allclose([ArTn], [ArTn_val], absolute_tolerance)) - call check(error, allclose([Arn2], [Arn2_val], absolute_tolerance)) - end subroutine test_pr76 - - subroutine test_pr78(error) - use yaeos__constants, only: pr - use fixtures_models, only: binary_PR78 - use yaeos, only: ArModel - type(error_type), allocatable, intent(out) :: error - - class(ArModel), allocatable :: eos - integer, parameter :: n = 2 - real(pr) :: z(n), V, T - real(pr) :: Ar, ArV, ArV2, ArT, ArTV, ArT2 - real(pr) :: Arn(n), ArVn(n), ArTn(n), Arn2(n, n) - - real(pr) :: Ar_val, ArV_val, ArV2_val, ArT_val, ArTV_val, ArT2_val - real(pr) :: Arn_val(n), ArVn_val(n), ArTn_val(n), Arn2_val(n, n) - - Ar_val = -9.5079213387597061 - ArV_val = 8.8348105702414230 - ArT_val = 2.5288760006412853E-002 - ArT2_val = -8.1263714911056052E-005 - ArV2_val = -16.452712169871607 - ArTV_val = -2.4354181554918298E-002 - Arn_val = [-14.760083989416412, -19.878152533126190] - ArVn_val = [12.970846906902654, 17.944940224423746] - ArTn_val = [4.7299709855544367E-002, 5.0647183777961201E-002] - Arn2_val(1, :) = [-11.697767407192650, -13.516452437750393] - Arn2_val(2, :) = [-13.516452437750393, -19.842863669307611] - - eos = binary_PR78() - z = [0.3, 0.7] - v = 1 - T = 150 - call eos%residual_helmholtz( & - z, V, T, Ar=Ar, ArV=ArV, ArV2=ArV2, ArT=ArT, ArTV=ArTV, & - ArT2=ArT2, Arn=Arn, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2 & - ) - - call check(error, allclose([Ar], [Ar_val], absolute_tolerance)) - call check(error, allclose([ArV], [ArV_val], absolute_tolerance)) - call check(error, allclose([ArT], [ArT_val], absolute_tolerance)) - call check(error, allclose([ArTV], [ArTV_val], absolute_tolerance)) - call check(error, allclose([ArV2], [ArV2_val], absolute_tolerance)) - call check(error, allclose([ArT2], [ArT2_val], absolute_tolerance)) - - call check(error, allclose([ArVn], [ArVn_val], absolute_tolerance)) - call check(error, allclose([ArTn], [ArTn_val], absolute_tolerance)) - call check(error, allclose([Arn2], [Arn2_val], absolute_tolerance)) - end subroutine test_pr78 - - subroutine test_RKPR(error) - use yaeos__constants, only: pr - use fixtures_models, only: binary_RKPR - use yaeos, only: ArModel - type(error_type), allocatable, intent(out) :: error - - class(ArModel), allocatable :: eos - integer, parameter :: n = 2 - real(pr) :: z(n), V, T - real(pr) :: Ar, ArV, ArV2, ArT, ArTV, ArT2 - real(pr) :: Arn(n), ArVn(n), ArTn(n), Arn2(n, n) - - real(pr) :: Ar_val, ArV_val, ArV2_val, ArT_val, ArTV_val, ArT2_val - real(pr) :: Arn_val(n), ArVn_val(n), ArTn_val(n), Arn2_val(n, n) - - Ar_val = -9.6541186252034574 - ArV_val = 8.5061818342897215 - ArT_val = 1.3301884633774012E-002 - ArT2_val = -1.9562211875769947E-005 - ArV2_val = -15.099123194809264 - ArTV_val = -1.2486978726337868E-002 - Arn_val = [-15.217004560875642, -19.421713059077884] - ArVn_val = [12.139770675389641, 16.367417203699784] - ArTn_val = [2.0199347861976372E-002, 2.8184370138154075E-002] - Arn2_val(1, :) = [-11.365462852828104, -12.471616903896567] - Arn2_val(2, :) = [-12.471616903896567, -18.037045998394138] - - eos = binary_RKPR() - z = [0.3, 0.7] - v = 1 - T = 150 - call eos%residual_helmholtz( & - z, V, T, Ar=Ar, ArV=ArV, ArV2=ArV2, ArT=ArT, ArTV=ArTV, & - ArT2=ArT2, Arn=Arn, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2 & - ) - - call check(error, allclose([Ar], [Ar_val], absolute_tolerance)) - call check(error, allclose([ArV], [ArV_val], absolute_tolerance)) - call check(error, allclose([ArT], [ArT_val], absolute_tolerance)) - call check(error, allclose([ArTV], [ArTV_val], absolute_tolerance)) - call check(error, allclose([ArV2], [ArV2_val], absolute_tolerance)) - call check(error, allclose([ArT2], [ArT2_val], absolute_tolerance)) - - call check(error, allclose([ArVn], [ArVn_val], absolute_tolerance)) - call check(error, allclose([ArTn], [ArTn_val], absolute_tolerance)) - call check(error, allclose([Arn2], [Arn2_val], absolute_tolerance)) - end subroutine test_RKPR -end module test_cubic_implementations \ No newline at end of file + subroutine collect_suite(testsuite) + !> Collection of tests + type(unittest_type), allocatable, intent(out) :: testsuite(:) + + testsuite = [ & + new_unittest("SRK", test_srk), & + new_unittest("PR76", test_pr76), & + new_unittest("PR78", test_pr78), & + new_unittest("RKPR", test_RKPR) & + ] + end subroutine collect_suite + + subroutine test_srk(error) + use yaeos__constants, only: pr + use fixtures_models, only: binary_SRK + use yaeos, only: ArModel + type(error_type), allocatable, intent(out) :: error + + class(ArModel), allocatable :: eos + integer, parameter :: n = 2 + real(pr) :: z(n), V, T + real(pr) :: Ar, ArV, ArV2, ArT, ArTV, ArT2 + real(pr) :: Arn(n), ArVn(n), ArTn(n), Arn2(n, n) + + real(pr) :: Ar_val, ArV_val, ArV2_val, ArT_val, ArTV_val, ArT2_val + real(pr) :: Arn_val(n), ArVn_val(n), ArTn_val(n), Arn2_val(n, n) + + Ar_val = -9.4849231269705072 + ArV_val = 9.0478810077323164 + ArT_val = 3.0631941020155939E-002 + ArT2_val = -1.0589478951539604E-004 + ArV2_val = -17.255504598247207 + ArTV_val = -3.0039878324119831E-002 + Arn_val = [-14.710404803520872, -20.170975369630906] + ArVn_val = [13.488065586019152, 18.870121409429380] + ArTn_val = [5.7833039664119255E-002, 6.1888439276263030E-002] + Arn2_val(1, :) = [-11.980899399513874, -14.133993988331257] + Arn2_val(2, :) = [-14.133993988331257, -20.899890419408248] + + eos = binary_SRK() + z = [0.3, 0.7] + v = 1 + T = 150 + call eos%residual_helmholtz( & + z, V, T, Ar=Ar, ArV=ArV, ArV2=ArV2, ArT=ArT, ArTV=ArTV, & + ArT2=ArT2, Arn=Arn, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2 & + ) + + call check(error, allclose([Ar], [Ar_val], absolute_tolerance)) + call check(error, allclose([ArV], [ArV_val], absolute_tolerance)) + call check(error, allclose([ArT], [ArT_val], absolute_tolerance)) + call check(error, allclose([ArTV], [ArTV_val], absolute_tolerance)) + call check(error, allclose([ArV2], [ArV2_val], absolute_tolerance)) + call check(error, allclose([ArT2], [ArT2_val], absolute_tolerance)) + + call check(error, allclose([ArVn], [ArVn_val], absolute_tolerance)) + call check(error, allclose([ArTn], [ArTn_val], absolute_tolerance)) + call check(error, allclose([Arn2], [Arn2_val], absolute_tolerance)) + end subroutine test_srk + + subroutine test_pr76(error) + use yaeos__constants, only: pr + use fixtures_models, only: binary_PR76 + use yaeos, only: ArModel + type(error_type), allocatable, intent(out) :: error + + class(ArModel), allocatable :: eos + integer, parameter :: n = 2 + real(pr) :: z(n), V, T + real(pr) :: Ar, ArV, ArV2, ArT, ArTV, ArT2 + real(pr) :: Arn(n), ArVn(n), ArTn(n), Arn2(n, n) + + real(pr) :: Ar_val, ArV_val, ArV2_val, ArT_val, ArTV_val, ArT2_val + real(pr) :: Arn_val(n), ArVn_val(n), ArTn_val(n), Arn2_val(n, n) + + Ar_val = -9.5079213387597061 + ArV_val = 8.8348105702414230 + ArT_val = 2.5288760006412853E-002 + ArT2_val = -8.1263714911056052E-005 + ArV2_val = -16.452712169871607 + ArTV_val = -2.4354181554918298E-002 + Arn_val = [-14.760083989416412, -19.878152533126190] + ArVn_val = [12.970846906902654, 17.944940224423746] + ArTn_val = [4.7299709855544367E-002, 5.0647183777961201E-002] + Arn2_val(1, :) = [-11.697767407192650, -13.516452437750393] + Arn2_val(2, :) = [-13.516452437750393, -19.842863669307611] + + eos = binary_PR76() + z = [0.3, 0.7] + v = 1 + T = 150 + call eos%residual_helmholtz( & + z, V, T, Ar=Ar, ArV=ArV, ArV2=ArV2, ArT=ArT, ArTV=ArTV, & + ArT2=ArT2, Arn=Arn, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2 & + ) + + call check(error, allclose([Ar], [Ar_val], absolute_tolerance)) + call check(error, allclose([ArV], [ArV_val], absolute_tolerance)) + call check(error, allclose([ArT], [ArT_val], absolute_tolerance)) + call check(error, allclose([ArTV], [ArTV_val], absolute_tolerance)) + call check(error, allclose([ArV2], [ArV2_val], absolute_tolerance)) + call check(error, allclose([ArT2], [ArT2_val], absolute_tolerance)) + + call check(error, allclose([ArVn], [ArVn_val], absolute_tolerance)) + call check(error, allclose([ArTn], [ArTn_val], absolute_tolerance)) + call check(error, allclose([Arn2], [Arn2_val], absolute_tolerance)) + end subroutine test_pr76 + + subroutine test_pr78(error) + use yaeos__constants, only: pr + use fixtures_models, only: binary_PR78 + use yaeos, only: ArModel + type(error_type), allocatable, intent(out) :: error + + class(ArModel), allocatable :: eos + integer, parameter :: n = 2 + real(pr) :: z(n), V, T + real(pr) :: Ar, ArV, ArV2, ArT, ArTV, ArT2 + real(pr) :: Arn(n), ArVn(n), ArTn(n), Arn2(n, n) + + real(pr) :: Ar_val, ArV_val, ArV2_val, ArT_val, ArTV_val, ArT2_val + real(pr) :: Arn_val(n), ArVn_val(n), ArTn_val(n), Arn2_val(n, n) + + Ar_val = -9.5079213387597061 + ArV_val = 8.8348105702414230 + ArT_val = 2.5288760006412853E-002 + ArT2_val = -8.1263714911056052E-005 + ArV2_val = -16.452712169871607 + ArTV_val = -2.4354181554918298E-002 + Arn_val = [-14.760083989416412, -19.878152533126190] + ArVn_val = [12.970846906902654, 17.944940224423746] + ArTn_val = [4.7299709855544367E-002, 5.0647183777961201E-002] + Arn2_val(1, :) = [-11.697767407192650, -13.516452437750393] + Arn2_val(2, :) = [-13.516452437750393, -19.842863669307611] + + eos = binary_PR78() + z = [0.3, 0.7] + v = 1 + T = 150 + call eos%residual_helmholtz( & + z, V, T, Ar=Ar, ArV=ArV, ArV2=ArV2, ArT=ArT, ArTV=ArTV, & + ArT2=ArT2, Arn=Arn, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2 & + ) + + call check(error, allclose([Ar], [Ar_val], absolute_tolerance)) + call check(error, allclose([ArV], [ArV_val], absolute_tolerance)) + call check(error, allclose([ArT], [ArT_val], absolute_tolerance)) + call check(error, allclose([ArTV], [ArTV_val], absolute_tolerance)) + call check(error, allclose([ArV2], [ArV2_val], absolute_tolerance)) + call check(error, allclose([ArT2], [ArT2_val], absolute_tolerance)) + + call check(error, allclose([ArVn], [ArVn_val], absolute_tolerance)) + call check(error, allclose([ArTn], [ArTn_val], absolute_tolerance)) + call check(error, allclose([Arn2], [Arn2_val], absolute_tolerance)) + end subroutine test_pr78 + + subroutine test_RKPR(error) + use yaeos__constants, only: pr + use fixtures_models, only: binary_RKPR + use yaeos, only: ArModel + type(error_type), allocatable, intent(out) :: error + + class(ArModel), allocatable :: eos + integer, parameter :: n = 2 + real(pr) :: z(n), V, T + real(pr) :: Ar, ArV, ArV2, ArT, ArTV, ArT2 + real(pr) :: Arn(n), ArVn(n), ArTn(n), Arn2(n, n) + + real(pr) :: Ar_val, ArV_val, ArV2_val, ArT_val, ArTV_val, ArT2_val + real(pr) :: Arn_val(n), ArVn_val(n), ArTn_val(n), Arn2_val(n, n) + + Ar_val = -9.5995556136857765 + ArV_val = 8.7952184911116689 + ArT_val = 2.1732218215585023E-002 + ArT2_val = -4.7480350864298389E-005 + ArV2_val = -16.171996177263189 + ArTV_val = -2.0750113033467819E-002 + Arn_val = [-15.106022804526534, -19.804239027780842] + ArVn_val = [ 12.785101276300841, 17.623522645787737] + ArTn_val = [ 3.6168578086399804E-002, 4.5188225615222108E-002] + Arn2_val(1, :) = [-11.652771433485331, -13.270385522198149] + Arn2_val(2, :) = [-13.270385522198149, -19.489152947516825] + + + eos = binary_RKPR() + z = [0.3, 0.7] + v = 1 + T = 150 + call eos%residual_helmholtz( & + z, V, T, Ar=Ar, ArV=ArV, ArV2=ArV2, ArT=ArT, ArTV=ArTV, & + ArT2=ArT2, Arn=Arn, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2 & + ) + + call check(error, allclose([Ar], [Ar_val], absolute_tolerance)) + call check(error, allclose([ArV], [ArV_val], absolute_tolerance)) + call check(error, allclose([ArT], [ArT_val], absolute_tolerance)) + call check(error, allclose([ArTV], [ArTV_val], absolute_tolerance)) + call check(error, allclose([ArV2], [ArV2_val], absolute_tolerance)) + call check(error, allclose([ArT2], [ArT2_val], absolute_tolerance)) + + call check(error, allclose([ArVn], [ArVn_val], absolute_tolerance)) + call check(error, allclose([ArTn], [ArTn_val], absolute_tolerance)) + call check(error, allclose([Arn2], [Arn2_val], absolute_tolerance)) + end subroutine test_RKPR +end module test_cubic_implementations diff --git a/test/test_envelope_pt_2.f90 b/test/test_envelope_pt_2.f90 new file mode 100644 index 000000000..19c72e636 --- /dev/null +++ b/test/test_envelope_pt_2.f90 @@ -0,0 +1,31 @@ +program main + use yaeos + use fixtures_models, only: multicomponent_PR + use testing_aux, only: assert, test_title + implicit none + + type(CubicEoS) :: eos + type(PTEnvel2) :: env + type(EquilibriumState) :: sat + integer, parameter :: nc=12 + real(pr) :: z0(nc), zi(nc) + real(pr) :: z(nc), P, T + + real(pr) :: Tc=699.059 + real(pr) :: Pc=180.226 + + + write(*, *) test_title("PT envelope test multicomponent") + + eos = multicomponent_PR(z0, zi) + + z = z0 + P = 0.0001 + sat = saturation_temperature(eos, z, P, kind="dew") + + env = pt_envelope_2ph(eos, z, sat) + + call assert(abs(env%cps(1)%T - Tc) < 1e-3, "Critical Temperature") + call assert(abs(env%cps(1)%P - Pc) < 1e-3, "Critical Pressure") + write(1, *) env +end program \ No newline at end of file diff --git a/test/test_ge_hyperdual.f90 b/test/test_ge_hyperdual.f90 new file mode 100644 index 000000000..95db5d9b5 --- /dev/null +++ b/test/test_ge_hyperdual.f90 @@ -0,0 +1,121 @@ +module nrtl_hd + !! Example implementation of the NRTL model using automatic differentiation. + !! + !! The NRTL model is represented by the equations: + !! + !! \[tau = A + B/T\] + !! \[G = exp(-C * tau)\] + !! \[Ge = R * T * sum(n * sum(n * tau * G) / sum(n * G))\] + use yaeos + use yaeos__adiff_hyperdual_ge_api, only: GeModelAdiff + use hyperdual_mod + implicit none + + type, extends(GeModelAdiff) :: NRTLHD + !! NRTL model with automatic differentiation. + real(pr), allocatable :: A(:,:), B(:,:), C(:,:) + contains + procedure :: Ge => Ge + end type NRTLHD + +contains + function ge(self, n, t) + class(NRTLHD) :: self + type(hyperdual), intent(in) :: n(:) + type(hyperdual), intent(in) :: t + type(hyperdual) :: ge + + type(hyperdual) ::tau(size(n), size(n)), G(size(n), size(n)) + + + real(pr) :: down + integer :: i, j + + tau = self%a(:, :) + self%b(:, :)/T + G = exp(-self%C * tau) + + ge = 0._pr + do i=1,size(n) + ge = ge + n(i) * sum(n(:) * tau(:, i) * G(:, i)) / sum(n(:) * g(:, i)) + end do + ge = R * T * ge + end function ge +end module nrtl_hd + +program test + use yaeos + use nrtl_hd + use fixtures_models, only: binary_NRTL_tape + use testing_aux, only: test_title, assert + + type(NRTL) :: og + type(NRTLHD) :: imp + + real(pr) :: n(3), T + + real(pr) :: Geog, Geimp + real(pr) :: GeogT, GeimpT + real(pr) :: GeogT2, GeimpT2 + real(pr) :: Geogn(3), Geimpn(3) + real(pr) :: GeognT(3), GeimpNt(3) + real(pr) :: Geogn2(3,3), Geimpn2(3,3) + + real(pr) :: A(3,3), B(3,3), C(3,3) + + A = 0; B=0; C=0 + + A(1, 2) = 0.1; A(1, 3) = 0.2 + A(2, 1) = 0.3; A(2, 3) = 0.4 + A(3, 1) = 0.5; A(3, 2) = 0.6 + + B(1, 2) = 300; B(1, 3) = 500 + B(2, 1) = 700; B(2, 3) = 900 + B(3, 1) = 1100; B(3, 2) = 1300 + + C(1, 2) = 0.7; C(1, 3) = 0.8; C(2, 3) = 1.0 + C(2, 1) = 1.1; C(3, 1) = 1.2; C(3, 2) = 1.3 + + og%a = A + og%b = B + og%C = C + + imp%A = og%a + imp%B = og%b + imp%C = og%C + + n = [0.2, 0.8, 0.1] + T = 273 + + write(*, *) test_title("NRTL model with automatic differentiation") + + call og%excess_gibbs(n, T, Geog) + call imp%excess_gibbs(n, T, Geimp) + + call assert(abs(Geog - Geimp) < 1e-5, "Ge") + + call og%excess_gibbs(n, T, Geog, GeT=GeogT) + call imp%excess_gibbs(n, T, Geimp, GeT=GeimpT) + + call assert(abs(GeogT - GeimpT) < 1e-5, "GeT") + + call og%excess_gibbs(n, T, Ge=Geog, GeT2=GeogT2) + call imp%excess_gibbs(n, T, Ge=Geimp, GeT2=GeimpT2) + + call assert(abs(GeogT2 - GeimpT2) < 1e-5, "GeT2") + + call og%excess_gibbs(n, T, Ge=Geog, GeTn=GeognT) + call imp%excess_gibbs(n, T, Ge=Geimp, GeTn=GeimpnT) + + call assert(all(abs(GeognT - GeimpnT) < 1e-5), "GeTn") + + call og%excess_gibbs(n, T, Geog, Gen=Geogn) + call imp%excess_gibbs(n, T, Geimp, Gen=Geimpn) + + call assert(all(abs(Geogn - Geimpn) < 1e-5), "Gen") + + call og%excess_gibbs(n, T, Geog, Gen2=Geogn2) + call imp%excess_gibbs(n, T, Geog, Gen2=Geimpn2) + + call assert(all(abs(Geogn2 - Geimpn2) < 1e-5), "Gen2") + +end program \ No newline at end of file diff --git a/test/test_gerg2008.f90 b/test/test_gerg2008.f90 new file mode 100644 index 000000000..f533e04d8 --- /dev/null +++ b/test/test_gerg2008.f90 @@ -0,0 +1,62 @@ +program main + use yaeos, only: pr, CubicEoS, SoaveRedlichKwong, CriticalLine, critical_line, EquilibriumState, critical_point + use YAEOS__MODELS_AR_GERG2008, only: Gerg2008, gerg_2008 + use yaeos__consistency_armodel, only: numeric_ar_derivatives + use testing_aux, only: test_title, assert + implicit none + type(Gerg2008) :: model + type(CubicEoS) :: cubic + + real(pr) :: n(2), v, t, n0(2) + real(pr) :: ar, arv, arv2 + real(pr) :: art, art2, artv + real(pr) :: arvn(2), artn(2), arn(2), arn2(2,2) + real(pr) :: f1, f2, f3, f4, dx + integer :: comps(2) = [1, 4] + + real(pr) :: Arnum, ArVnum, ArV2Num, ArTnum, ArT2num, ArTVnum, ArNnum(2), ArN2num(2,2) + + model = gerg_2008(comps) + cubic = model%srk + + print *, test_title("GERG 2008") + + n = [0.5, 0.5] + + v = 1 + T = 150 + + call model%residual_helmholtz(& + n, v, t, ar=ar, arv=arv, art=art, artv=artv, & + arv2=arv2, art2=art2, arn=arn, arvn=arvn, artn=artn, arn2=arn2) + call assert(abs(ar - (-11.1819)) < 1e-4, "Ar Value from literature") + + call numeric_ar_derivatives(& + model, n, V, T, d_n=0.00001_pr, d_v=0.00001_pr, d_t=0.001_pr, & + Ar=ArNum, ArV=ArVNum, ArV2=ArV2Num, ArT=ArTNum, & + ArT2=ArT2Num, ArTV=ArTVNum, ArN=ArNNum, ArN2=ArN2Num) + + call assert(abs(ArNum - Ar) < 1e-5, "Ar Value") + call assert(abs(ArVnum - ArV) < 1e-5, "ArV Value") + call assert(abs(ArV2Num - ArV2) < 1e-3, "ArV2 Value") + call assert(abs(ArTnum - ArT) < 1e-5, "ArT Value") + call assert(abs(ArT2num - ArT2) < 1e-5, "ArT2 Value") + call assert(abs(ArTVnum - ArTV) < 1e-5, "ArTV Value") + call assert(all(abs(ArNnum - ArN) < 1e-5), "ArN Value") + call assert(all(abs(ArN2num - ArN2) < 1e-3), "ArN2 Value") + + + call model%volume(n, 1.0_pr, T, f1, root_type="liquid") + call cubic%volume(n, 1.0_pr, T, f2, root_type="liquid") + call assert(abs(f1 - f2) < 1e-2, "Liquid root close to SRK") + + call model%volume(n, 1.0_pr, T, f1, root_type="vapor") + call cubic%volume(n, 1.0_pr, T, f2, root_type="vapor") + + call assert(abs(f1 - f2) < 0.1, "Vapor root close to SRK") + + call model%volume(n, 1.0_pr, T, f1, root_type="stable") + call cubic%volume(n, 1.0_pr, T, f2, root_type="stable") + call assert(abs(f1 - f2) < 1e-1, "Stable root close to SRK") + +end program main diff --git a/test/test_implementations/ar_models/cubics/test_rkpr.f90 b/test/test_implementations/ar_models/cubics/test_rkpr.f90 index 63de1613e..ab7bc05d6 100644 --- a/test/test_implementations/ar_models/cubics/test_rkpr.f90 +++ b/test/test_implementations/ar_models/cubics/test_rkpr.f90 @@ -34,6 +34,7 @@ subroutine test_rkpr_cons_mixture(error) real(pr) :: eq31, eq33(size(n), size(n)), eq34(size(n)), eq36, eq37 real(pr) :: kij(size(n), size(n)), lij(size(n), size(n)) + real(pr) :: tol n = [1.5, 0.2, 0.7, 2.3] tc = [369.83, 425.12, 507.6, 540.2] @@ -54,7 +55,7 @@ subroutine test_rkpr_cons_mixture(error) ArTV=ArTV, ArV2=ArV2, ArT2=ArT2, ArVn=ArVn, ArTn=ArTn, Arn2=Arn2) call numeric_ar_derivatives(& - model, n, v, t, d_n = 0.0001_pr, d_v = 0.0001_pr, d_t = 0.01_pr, & + model, n, v, t, d_n = 0.0001_pr, d_v = 0.00001_pr, d_t = 0.001_pr, & Ar=Ar_num, ArV=ArV_num, ArT=ArT_num, ArTV=ArTV_num, ArV2=ArV2_num, & ArT2=ArT2_num, Arn=Arn_num, ArVn=ArVn_num, ArTn=ArTn_num, & Arn2=Arn2_num & @@ -64,24 +65,26 @@ subroutine test_rkpr_cons_mixture(error) model, n, v, t, eq31=eq31, eq33=eq33, eq34=eq34, eq36=eq36, eq37=eq37 & ) + tol = 1e-3 + ! Numeric derivatives - call check(error, rel_error(Ar, Ar_num) < 1e-5) - call check(error, rel_error(ArV, ArV_num) < 1e-5) - call check(error, rel_error(ArT, ArT_num) < 1e-5) - call check(error, allclose(Arn, Arn_num, 1e-5_pr)) - call check(error, rel_error(ArV2, ArV2_num) < 1e-5) - call check(error, rel_error(ArT2, ArT2_num) < 1e-5) - call check(error, rel_error(ArTV, ArTV_num) < 1e-5) - call check(error, allclose(ArVn, ArVn_num, 1e-5_pr)) - call check(error, allclose(ArTn, ArTn_num, 1e-5_pr)) - call check(error, maxval(rel_error(Arn2, Arn2_num)) < 1e-5) + call check(error, rel_error(Ar, Ar_num) < tol) + call check(error, rel_error(ArV, ArV_num) < tol) + call check(error, rel_error(ArT, ArT_num) < tol) + call check(error, allclose(Arn, Arn_num, tol)) + call check(error, rel_error(ArV2, ArV2_num) < tol) + call check(error, rel_error(ArT2, ArT2_num) < tol) + call check(error, rel_error(ArTV, ArTV_num) < tol) + call check(error, allclose(ArVn, ArVn_num, tol)) + call check(error, allclose(ArTn, ArTn_num, tol)) + call check(error, maxval(rel_error(Arn2, Arn2_num)) < tol) ! Consistency tests - call check(error, abs(eq31) <= 1e-13) - call check(error, maxval(abs(eq33)) < 1e-14) - call check(error, maxval(abs(eq34)) < 1e-14) - call check(error, abs(eq36) <= 1e-14) - call check(error, abs(eq37) <= 1e-14) + call check(error, abs(eq31) <= 1e-12) + call check(error, maxval(abs(eq33)) < 1e-12) + call check(error, maxval(abs(eq34)) < 1e-12) + call check(error, abs(eq36) <= 1e-12) + call check(error, abs(eq37) <= 1e-12) ! ======================================================================== ! Model with kij and lij @@ -118,23 +121,23 @@ subroutine test_rkpr_cons_mixture(error) ) ! Numeric derivatives - call check(error, rel_error(Ar, Ar_num) < 1e-5) - call check(error, rel_error(ArV, ArV_num) < 1e-5) - call check(error, rel_error(ArT, ArT_num) < 1e-5) - call check(error, allclose(Arn, Arn_num, 1e-5_pr)) - call check(error, rel_error(ArV2, ArV2_num) < 1e-5) - call check(error, rel_error(ArT2, ArT2_num) < 1e-5) - call check(error, rel_error(ArTV, ArTV_num) < 1e-5) - call check(error, allclose(ArVn, ArVn_num, 1e-5_pr)) - call check(error, allclose(ArTn, ArTn_num, 1e-5_pr)) - call check(error, maxval(rel_error(Arn2, Arn2_num)) < 1e-5) + call check(error, rel_error(Ar, Ar_num) < tol) + call check(error, rel_error(ArV, ArV_num) < tol) + call check(error, rel_error(ArT, ArT_num) < tol) + call check(error, allclose(Arn, Arn_num, tol)) + call check(error, rel_error(ArV2, ArV2_num) < tol) + call check(error, rel_error(ArT2, ArT2_num) < tol) + call check(error, rel_error(ArTV, ArTV_num) < tol) + call check(error, allclose(ArVn, ArVn_num, tol)) + call check(error, allclose(ArTn, ArTn_num, tol)) + call check(error, maxval(rel_error(Arn2, Arn2_num)) < tol) ! Consistency tests - call check(error, abs(eq31) <= 1e-13) - call check(error, maxval(abs(eq33)) < 1e-14) - call check(error, maxval(abs(eq34)) < 1e-13) - call check(error, abs(eq36) <= 1e-14) - call check(error, abs(eq37) <= 1e-14) + call check(error, abs(eq31) <= 1e-12) + call check(error, maxval(abs(eq33)) < 1e-12) + call check(error, maxval(abs(eq34)) < 1e-12) + call check(error, abs(eq36) <= 1e-12) + call check(error, abs(eq37) <= 1e-12) end subroutine test_rkpr_cons_mixture subroutine test_rkpr_cons_pure(error) diff --git a/test/test_implementations/ge_models/test_unifac.f90 b/test/test_implementations/ge_models/test_unifac.f90 index 45b740e89..9b7a5f09b 100644 --- a/test/test_implementations/ge_models/test_unifac.f90 +++ b/test/test_implementations/ge_models/test_unifac.f90 @@ -181,7 +181,7 @@ subroutine test_against_caleb_thermo(error) type(Groups) :: molecules(nc) - real(pr) :: Ge, Gen(nc), GeT, GeT2, GeTn(nc), Gen2(nc, nc) + real(pr) :: He, Ge, Gen(nc), GeT, GeT2, GeTn(nc), Gen2(nc, nc) real(pr) :: Ge_i, Gen_i(nc), GeT_i, GeT2_i, GeTn_i(nc), Gen2_i(nc, nc) real(pr) :: ln_gammas(nc) @@ -206,6 +206,9 @@ subroutine test_against_caleb_thermo(error) ! setup UNIFAC model model = setup_unifac(molecules) + ! Call He + call model%excess_enthalpy(n, T, He=He) + ! Call all Ge and derivatives call model%excess_gibbs(n, T, Ge, GeT, GeT2, Gen, GeTn, Gen2) @@ -220,9 +223,12 @@ subroutine test_against_caleb_thermo(error) ! Call GeModel class method call model%ln_activity_coefficient(n, T, ln_gammas) - ! ======================================================================== + ! ======================================================================= ! Test against Caleb Bell's implementation - ! ------------------------------------------------------------------------ + ! ----------------------------------------------------------------------- + ! He + call check(error, abs(He + 812.66634286380702_pr) < 1e-7) + ! Ge call check(error, abs(Ge / n_t - (-3.223992676822129_pr)) <= 1e-10) @@ -252,9 +258,9 @@ subroutine test_against_caleb_thermo(error) ! GeTn call check(error, allclose(GeTn, [0.06015389_pr, 0.02239722_pr, 0.04975642_pr], 1e-6_pr)) - ! ======================================================================== + ! ======================================================================= ! Test individual calls - ! ------------------------------------------------------------------------ + ! ----------------------------------------------------------------------- call check(error, abs(Ge - Ge_i) <= 1e-10) call check(error, abs(GeT - GeT_i) <= 1e-10) call check(error, abs(GeT2 - GeT2_i) <= 1e-10) @@ -265,9 +271,9 @@ subroutine test_against_caleb_thermo(error) call check(error, allclose(Gen2(2,:), Gen2_i(2,:), 1e-10_pr)) call check(error, allclose(Gen2(3,:), Gen2_i(3,:), 1e-10_pr)) - ! ======================================================================== + ! ======================================================================= ! Test pair calls - ! ------------------------------------------------------------------------ + ! ----------------------------------------------------------------------- ! Ge call model%excess_gibbs(n, T, Ge=Ge_i, GeT=GeT_i) call check(error, abs(Ge - Ge_i) <= 1e-10) @@ -336,9 +342,9 @@ subroutine test_against_caleb_thermo(error) call check(error, allclose(Gen2(2,:), Gen2_i(2,:), 1e-10_pr)) call check(error, allclose(Gen2(3,:), Gen2_i(3,:), 1e-10_pr)) - ! ======================================================================== + ! ======================================================================= ! Just one triplet call test - ! ------------------------------------------------------------------------ + ! ----------------------------------------------------------------------- call model%excess_gibbs(n, T, Ge=Ge_i, GeT=GeT_i, Gen2=Gen2_i) call check(error, abs(Ge - Ge_i) <= 1e-10) call check(error, abs(GeT - GeT_i) <= 1e-10) diff --git a/test/test_models_ar_cubic_quadrating_mixing.f90 b/test/test_models_ar_cubic_quadrating_mixing.f90 index c376ccf4d..4dd8d4ea5 100644 --- a/test/test_models_ar_cubic_quadrating_mixing.f90 +++ b/test/test_models_ar_cubic_quadrating_mixing.f90 @@ -20,10 +20,10 @@ end subroutine collect_suite subroutine test_QMR_RKPR(error) use yaeos__constants, only: pr - use yaeos__models_ar_cubic_quadratic_mixing, only: QMR_RKPR + use yaeos__models_ar_cubic_quadratic_mixing, only: QMR type(error_type), allocatable, intent(out) :: error - type(QMR_RKPR) :: mixrule + type(QMR) :: mixrule integer, parameter :: n = 3 real(pr) :: del1(3) = [0.2, 0.5, 0.6] diff --git a/test/test_purePsat.f90 b/test/test_purePsat.f90 new file mode 100644 index 000000000..db5a7d58a --- /dev/null +++ b/test/test_purePsat.f90 @@ -0,0 +1,45 @@ +program main + use yaeos + use yaeos__equilibria_boundaries_pure_saturation, only: pure_saturation_line, PurePsat, Psat => solve_point + use forsus, only: Substance, forsus_default_dir, forsus_dir + use testing_aux, only: assert, test_title + implicit none + type(CubicEoS) :: model + type(EquilibriumState) :: sat + type(PurePsat) :: pt + type(Substance) :: sus(2) + + real(pr) :: a, z(2), P, T + + real(Pr) :: Tc(2), Pc(2) + integer :: i + + print *, test_title("Pure Psat curve") + + forsus_dir = "build/dependencies/forsus/" // forsus_default_dir + + sus(1) = Substance("methane") + sus(2) = Substance("propane") + + model = PengRobinson76(& + Tc=sus%critical%critical_temperature%value, & + Pc=sus%critical%critical_pressure%value/1e5, & + w=sus%critical%acentric_factor%value & + ) + + + ! ========================================================================== + ! Test the pure saturation line of propane + ! ------------------------------------------------------------------------- + pt = pure_saturation_line(model, 2, 0.001_pr, 100._pr) + call assert(abs(pt%get_P(200._pr) - 0.2068) < 0.1_Pr, "Propane Psat at 140K") + call assert(abs(pt%get_T(10._pr) - 300.08) < 0.1_Pr, "Propane Psat at 10 bar") + + + ! ========================================================================== + ! Test the pure saturation line of methane + ! ------------------------------------------------------------------------- + pt = pure_saturation_line(model, 1, 1._pr, 100._pr) + call assert(abs(pt%get_P(140._pr) - 6.45) < 0.1_Pr, "Methane Psat at 140K") + call assert(abs(pt%get_T(10._pr) - 148.970) < 0.1_Pr, "Methane Psat at 10 bar") +end program main diff --git a/test/test_qmrtd.f90 b/test/test_qmrtd.f90 new file mode 100644 index 000000000..0d2e6b922 --- /dev/null +++ b/test/test_qmrtd.f90 @@ -0,0 +1,109 @@ +program main + use yaeos + implicit none + type(CubicEoS) :: model + type(QMRTD) :: mixrule + + integer, parameter :: nc=2 + real(pr) :: k0(nc, nc)=0, kinf(nc, nc)=0, Tref(nc, nc)=0 + + real(pr) :: tc(nc), pc(nc), w(nc) + + real(pr) :: D, dDT, dDT2, dDi(nc), dDij(nc, nc), dDidT(nc) + real(pr) :: ai(nc), daidt(nc), daidt2(nc) + + real(pr) :: n(nc), T, V, P, f1, f2, f3, f4, dx=1E-3 + integer :: i, j + + tc = [126.2, 568.7] + pc = [33.98, 24.9] + w = [9.01E-002, 0.492] + + k0(1, 2) = 0!-0.429315E+00 + k0(2, 1) = k0(1, 2) + kinf(1, 2) = 0.485065E+01 + kinf(2, 1) = kinf(1, 2) + + Tref(1, 2) = Tc(1) + Tref(2, 1) = Tref(1, 2) + + mixrule = QMRTD(k=kinf, k0=k0, Tref=Tref, l=0*k0) + + model = SoaveRedlichKwong(Tc, Pc, w, kij=kinf) + n = [0.2, 0.8] + T = 150 + + + print *, "===================================================================" + print *, "NORMAL MR" + call model%alpha%alpha(T/model%components%Tc, ai, daidt, daidt2) + ai = ai*model%ac + daidt = daidt*model%ac/model%components%Tc + daidt2 = daidt2*model%ac/model%components%Tc**2 + call model%mixrule%Dmix(n, T, ai=ai, daidt=daidt, daidt2=daidt2, D=D, dDdT=dDT, dDdT2=dDT2, dDi=dDi, dDidT=dDidT, dDij=dDij) + print *, D, dDT, dDT2 + print *, dDi + print *, dDidT + print *, dDij + print *, "===================================================================" + + + call model%set_mixrule(mixrule) + + call model%alpha%alpha(T/model%components%Tc, ai, daidt, daidt2) + ai = ai*model%ac + daidt = daidt*model%ac/model%components%Tc + daidt2 = daidt2*model%ac/model%components%Tc**2 + + + call model%mixrule%Dmix(n, T, ai=ai, daidt=daidt, daidt2=daidt2, D=D, dDdT=dDT, dDdT2=dDT2, dDi=dDi, dDidT=dDidT, dDij=dDij) + print *, D + + f2 = get_D(n, T+dx) + f1 = get_D(n, T-dx) + + print *, (f2-f1)/(2*dx), dDT + print *, (f2 - 2*D + f1)/dx**2, dDT2 + + do i = 1, nc + n = [0.2, 0.8] + n(i) = n(i) + dx + f2 = get_D(n, T) + n(i) = n(i) - 2*dx + f1 = get_D(n, T) + n(i) = n(i) + dx + print *, (f2-f1)/(2*dx), dDi(i) + end do + + dx = 0.01 + + f1 = get_D(n + [dx, dx], T) + f2 = get_D(n + [dx, -dx], T) + f3 = get_D(n + [-dx, dx], T) + f4 = get_D(n + [-dx, -dx], T) + print *, (f1 - f2 - f3 + f4)/(4*dx**2), dDij(1, 2), dDij(2, 1) + + dx = 0.01 + f1 = get_D(n + [dx, 0._pr], T) + f2 = get_D(n - [dx, 0._pr], T) + print *, (f1 - 2*D + f2)/(dx**2), dDij(1, 1) + + f1 = get_D(n + [0._pr, dx], T) + f2 = get_D(n - [0._pr, dx], T) + print *, (f1 - 2*D + f2)/(dx**2), dDij(2, 2) + + +contains + real(pr) function get_D(n, T) result(D) + real(pr) :: n(nc), T + + real(pr) :: ai(nc), daidt(nc), daidt2(nc) + real(pr) :: dDT, dDT2, dDi(nc), dDij(nc, nc), dDidT(nc) + + call model%alpha%alpha(T/model%components%Tc, ai, daidt, daidt2) + ai = ai*model%ac + daidt = daidt*model%ac/model%components%Tc + daidt2 = daidt2*model%ac/model%components%Tc**2 + call model%mixrule%Dmix(n, T, ai=ai, daidt=daidt, daidt2=daidt2, D=D, dDdT=dDT, dDdT2=dDT2, dDi=dDi, dDidT=dDidT, dDij=dDij) + end function get_D +end program main diff --git a/test/test_saturation.f90 b/test/test_saturation.f90 index 93f9e8e71..3da472196 100644 --- a/test/test_saturation.f90 +++ b/test/test_saturation.f90 @@ -89,13 +89,11 @@ subroutine test_dew_temperature(error) class(ArModel), allocatable :: model type(EquilibriumState) :: dew - real(pr) :: x(nc) = [6.7257479103310133E-002, 0.93274263301184768] + real(pr) :: x(nc) = [0.0673, 0.9327] real(pr) :: y(nc) = [0.4, 0.6] real(pr) :: P = 10.867413040635611 - real(pr) :: n(nc), k(nc), t - - integer :: i + real(pr) :: n(nc), t n = [0.4_pr, 0.6_pr] T = 240 @@ -105,8 +103,8 @@ subroutine test_dew_temperature(error) call check(error, abs(dew%P-P) < abs_tolerance) call check(error, abs(dew%T-T) < abs_tolerance) - call check(error, maxval(abs(dew%x-x)) < abs_tolerance) - call check(error, maxval(abs(dew%y-y)) < abs_tolerance) + call check(error, maxval(abs(dew%x-x)) < 1e-4) + call check(error, maxval(abs(dew%y-y)) < 1e-4) end subroutine test_dew_temperature subroutine test_bubble_temperature(error) @@ -185,7 +183,7 @@ subroutine test_px2_envelope(error) end subroutine test_px2_envelope subroutine test_pure_psat(error) - use yaeos, only: pr, ArModel, Psat + use yaeos, only: pr, ArModel use fixtures_models, only: binary_PR76 type(error_type), allocatable, intent(out) :: error class(ArModel), allocatable :: model @@ -198,7 +196,7 @@ subroutine test_pure_psat(error) Psats_val = [260.37450286310201, 30.028551527997834] do i=1,2 - Psats(i) = Psat(model, i, T) + Psats(i) = model%Psat_pure(i, T) end do ! call check(error, maxval(abs(Psats-Psats_val)) < abs_tolerance) end subroutine test_pure_psat diff --git a/test/test_saturation_solver.f90 b/test/test_saturation_solver.f90 index 686ba71e6..a6ebd942b 100644 --- a/test/test_saturation_solver.f90 +++ b/test/test_saturation_solver.f90 @@ -13,7 +13,7 @@ program main integer, parameter :: nc = 2, nf = nc + 4 - real(pr) :: n(nc), T, P, Vy, Vz, X(nf), S, F(nf), df(nf,nf) + real(pr) :: n(nc), T, P, Vy, Vz, dPdVy, dPdVz, X(nf), S, F(nf), df(nf,nf) real(pr) :: dx(nf), dFnum(nf, nf), Fdx(nf), dftmp(nf,nf) real(pr) :: Px, Py integer :: i, ns @@ -65,7 +65,7 @@ subroutine numdiff S = T ns = nc+3 dx = 0 - call saturation_F(model, n, X, ns, S, F, dF) + call saturation_F(model, n, X, ns, S, F, dF, dPdVz, dPdVy) print *, F print *, "numdiff" @@ -73,7 +73,7 @@ subroutine numdiff dx = 0 dx(i) = 1e-9 - call saturation_F(model, n, X+dx, ns, S, Fdx, dFtmp) + call saturation_F(model, n, X+dx, ns, S, Fdx, dFtmp, dPdVz, dPdVy) dFnum(:, i) = (Fdx - F) / dx(i) print *, dfnum(:, i) diff --git a/test/test_thermoprops.f90 b/test/test_thermoprops_ar.f90 similarity index 100% rename from test/test_thermoprops.f90 rename to test/test_thermoprops_ar.f90 diff --git a/test/test_thermoprops_ge.f90 b/test/test_thermoprops_ge.f90 new file mode 100644 index 000000000..e5d7bbcc2 --- /dev/null +++ b/test/test_thermoprops_ge.f90 @@ -0,0 +1,218 @@ +program main + use yaeos, only: pr, R + use yaeos, only: setup_unifac, UNIFAC, Groups + use auxiliar_functions, only: allclose, rel_error + use testing_aux, only: assert, test_title, test_ok + + implicit none + + integer, parameter :: nc = 3 + + type(UNIFAC) :: model + type(Groups) :: molecules(nc) + + real(pr) :: n(nc), n_aux1(nc), n_aux2(nc), T + + real(pr) :: lngamma(nc), dlngammadT(nc), dlngammadn(nc, nc) + real(pr) :: lngammadn_num(nc, nc), lngammadT_num(nc), lngamma_aux1(nc) + real(pr) :: lngamma_aux2(nc), dlngammadn_aux(nc, nc), dlngammadT_aux(nc) + + real(pr) :: Ge + + real(pr) :: He, HeT, Hen(nc) + real(pr) :: Hen_num(nc), HeT_num, He_aux1, He_aux2, HeT_aux, Hen_aux(nc) + + real(pr) :: Se, SeT, Sen(nc) + real(pr) :: Sen_num(nc), SeT_num, Se_aux1, Se_aux2, SeT_aux, Sen_aux(nc) + + real(pr) :: dn=0.0001_pr, dT=0.0001_pr + + integer :: i, j + + print *, test_title("Thermoprops With Excess Gibbs Models") + + T = 303.15_pr + n = [21.48_pr, 11.42_pr, 16.38_pr] + + ! ! Ethane [CH3] + molecules(1)%groups_ids = [1] + molecules(1)%number_of_groups = [2] + + ! ! Ethanol [CH3, CH2, OH] + molecules(2)%groups_ids = [1, 2, 14] + molecules(2)%number_of_groups = [1, 1, 1] + + ! ! Methylamine [H3C-NH2] + molecules(3)%groups_ids = [28] + molecules(3)%number_of_groups = [1] + + ! setup UNIFAC model + model = setup_unifac(molecules) + + ! Properties on point + call model%excess_gibbs(n, T, Ge=Ge) + + call model%ln_activity_coefficient(& + n, T, lngamma=lngamma, dlngammadT=dlngammadT, dlngammadn=dlngammadn & + ) + + call model%excess_enthalpy(n, T, He=He, HeT=HeT, Hen=Hen) + + call model%excess_entropy(n, T, Se=Se, SeT=SeT, Sen=Sen) + + ! ========================================================================== + ! Obvious test + ! -------------------------------------------------------------------------- + ! Activity coefficients + + call assert(& + rel_error(R * T * sum(n * lngamma), Ge) < 1e-10_pr,& + "Test Thermoprops GE: ln(gamma) and GE"& + ) + + ! Entropy + call assert(& + rel_error(Se, (He - Ge) / T) < 1e-10_pr,& + "Test Thermoprops GE: Se and GE"& + ) + + ! ========================================================================== + ! Individual calls + ! -------------------------------------------------------------------------- + ! ln(gamma) + call model%ln_activity_coefficient(n, T, lngamma=lngamma_aux1) + call model%ln_activity_coefficient(n, T, dlngammadT=dlngammadT_aux) + call model%ln_activity_coefficient(n, T, dlngammadn=dlngammadn_aux) + + call assert(& + allclose(lngamma, lngamma_aux1, 1.0E-10_pr),& + "Test Thermoprops GE: ln(gamma)") + + call assert(& + allclose(dlngammadT, dlngammadT_aux, 1.0E-10_pr),& + "Test Thermoprops GE: dln(gamma)/dT") + + do i = 1,nc + call assert(& + allclose(dlngammadn(i,:), dlngammadn_aux(i,:),1.0E-10_pr),& + "Test Thermoprops GE: dln(gamma)/dn") + end do + + ! Excess enthalpy + call model%excess_enthalpy(n, T, He=He_aux1) + call model%excess_enthalpy(n, T, HeT=HeT_aux) + call model%excess_enthalpy(n, T, Hen=Hen_aux) + + call assert(rel_error(He, He_aux1) < 1e-10_pr, & + "Test Thermoprops GE: He") + + call assert(rel_error(HeT, HeT_aux) < 1e-10_pr, & + "Test Thermoprops GE: HeT") + + call assert(allclose(Hen, Hen_aux, 1.0E-10_pr), & + "Test Thermoprops GE: Hen") + + ! Excess entropy + call model%excess_entropy(n, T, Se=Se_aux1) + call model%excess_entropy(n, T, SeT=SeT_aux) + call model%excess_entropy(n, T, Sen=Sen_aux) + + call assert(rel_error(Se, Se_aux1) < 1e-10_pr, & + "Test Thermoprops GE: Se") + + call assert(rel_error(SeT, SeT_aux) < 1e-10_pr, & + "Test Thermoprops GE: SeT") + + call assert(allclose(Sen, Sen_aux, 1.0E-10_pr), & + "Test Thermoprops GE: Sen") + + ! ========================================================================== + ! Derivatives + ! -------------------------------------------------------------------------- + ! dln(gamma)/dT + call model%ln_activity_coefficient(n, T + dT, lngamma=lngamma_aux1) + call model%ln_activity_coefficient(n, T - dT, lngamma=lngamma_aux2) + + lngammadT_num = (lngamma_aux1 - lngamma_aux2)/(2.0_pr*dT) + + call assert(allclose(dlngammadT, lngammadT_num, 1.0E-5_pr), & + "Test Thermoprops GE: dln(gamma)/dT") + + ! dln(gamma)/dn + lngammadn_num = 0.0_pr + + do i=1, nc + do j=1,nc + n_aux1 = n + n_aux2 = n + + n_aux1(j) = n_aux1(j) + dn + n_aux2(j) = n_aux2(j) - dn + + call model%ln_activity_coefficient(n_aux1, T, lngamma=lngamma_aux1) + call model%ln_activity_coefficient(n_aux2, T, lngamma=lngamma_aux2) + + lngammadn_num(i,j) = (lngamma_aux1(i) - lngamma_aux2(i))/(2.0_pr * dn) + end do + end do + + do i = 1,nc + call assert(allclose(dlngammadn(i,:), lngammadn_num(i,:), 1.0E-5_pr),& + "Test Thermoprops GE: dln(gamma)/dn") + end do + + ! dHe/dT + call model%excess_enthalpy(n, T + dT, He=He_aux1) + call model%excess_enthalpy(n, T - dT, He=He_aux2) + + HeT_num = (He_aux1 - He_aux2) / (2.0_pr * dT) + + call assert(rel_error(HeT, HeT_num) < 1e-6,& + "Test Thermoprops GE: dHe/dT") + + ! dHe/dn + Hen_num = 0.0_pr + + do i=1, nc + n_aux1 = n + n_aux2 = n + + n_aux1(i) = n_aux1(i) + dn + n_aux2(i) = n_aux2(i) - dn + + call model%excess_enthalpy(n_aux1, T, He=He_aux1) + call model%excess_enthalpy(n_aux2, T, He=He_aux2) + + Hen_num(i) = (He_aux1 - He_aux2) / (2.0_pr * dn) + end do + + call assert (allclose(Hen, Hen_num, 1.0E-6_pr),"Test Thermoprops GE: dHe/dn") + + ! dSe/dT + call model%excess_entropy(n, T + dT, Se=Se_aux1) + call model%excess_entropy(n, T - dT, Se=Se_aux2) + + SeT_num = (Se_aux1 - Se_aux2) / (2.0_pr * dT) + + call assert(rel_error(SeT, SeT_num) < 1e-6, & + "Test Thermoprops GE: dSe/dT") + + ! dSe/dn + Sen_num = 0.0_pr + + do i=1, nc + n_aux1 = n + n_aux2 = n + + n_aux1(i) = n_aux1(i) + dn + n_aux2(i) = n_aux2(i) - dn + + call model%excess_entropy(n_aux1, T, Se=Se_aux1) + call model%excess_entropy(n_aux2, T, Se=Se_aux2) + + Sen_num(i) = (Se_aux1 - Se_aux2) / (2.0_pr * dn) + end do + + call assert(allclose(Sen, Sen_num, 1.0E-6_pr), & + "Test Thermoprops GE: dSe/dn") +end program main diff --git a/test/test_tx.f90 b/test/test_tx.f90 new file mode 100644 index 000000000..33a3adbb1 --- /dev/null +++ b/test/test_tx.f90 @@ -0,0 +1,61 @@ +program main + use yaeos + use yaeos__math, only: interpol + use yaeos__equilibria_boundaries_pure_saturation, only: PurePsat, pure_saturation_line + use forsus, only: forsus_default_dir, forsus_dir, Substance + use testing_aux, only: test_title, assert + + type(EquilibriumState) :: sat + type(TXEnvel2) :: tx + type(CubicEoS) :: model + + integer, parameter :: nc=2 + real(pr) :: z0(nc)= [1, 0] + real(pr) :: zi(nc)= [0, 1] + real(pr) :: z(nc), T, P + real(pr) :: a + real(pr) :: Tenv + type(Substance) :: sus(nc) + type(PurePsat) :: vp1, vp2 + + integer :: i + + write(*, *) test_title("TX Envelope 2ph") + + forsus_dir = "build/dependencies/forsus/" // forsus_default_dir + sus(1) = Substance("methane") + sus(2) = Substance("propane") + + model = PengRobinson76(& + Tc=sus%critical%critical_temperature%value, & + Pc=sus%critical%critical_pressure%value/1e5, & + w=sus%critical%acentric_factor%value & + ) + + vp1 = pure_saturation_line(model, 1, 1._pr, 100._pr) + vp2 = pure_saturation_line(model, 2, 1._pr, 100._pr) + + P = 10._pr + T = vp1%get_T(P) + + a = 0.001 + z = zi*a + z0*(1-a) + sat = saturation_temperature(model, z, P=P, kind="bubble", T0=T) + tx = tx_envelope_2ph(model, z0=z0, alpha0=a, z_injection=zi, first_point=sat) + + i = minloc(abs(270._pr - tx%points%T), dim=1) + + Tenv = interpol(& + tx%points(i)%y(1), tx%points(i+1)%y(1), & + tx%points(i)%T, tx%points(i+1)%T, 0.53_pr & + ) + + call assert(abs(Tenv - 270.3_pr) < 0.1_pr, "Predicted Dew Temperature") + + P = sum(model%components%Pc)/2 + T = vp1%get_T(P) + sat = saturation_temperature(model, z, P=P, kind="bubble", T0=T) + tx = tx_envelope_2ph(model, z0=z0, alpha0=a, z_injection=zi, first_point=sat) + + call assert(abs(tx%points(size(tx%points))%T - 368) < 1, "Reach to critical point") +end program main