Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
O
ogs
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
wenqing
ogs
Commits
198b41dd
Commit
198b41dd
authored
4 years ago
by
renchao.lu
Browse files
Options
Downloads
Patches
Plain Diff
[CL] Replace with chemical system index map.
parent
f95c1cfb
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
ChemistryLib/PhreeqcIO.cpp
+197
-188
197 additions, 188 deletions
ChemistryLib/PhreeqcIO.cpp
with
197 additions
and
188 deletions
ChemistryLib/PhreeqcIO.cpp
+
197
−
188
View file @
198b41dd
...
...
@@ -242,81 +242,83 @@ std::ostream& operator<<(std::ostream& os, PhreeqcIO const& phreeqc_io)
os
<<
reaction_rates
<<
"
\n
"
;
}
std
::
size_t
const
num_chemical_systems
=
phreeqc_io
.
_mesh
.
getNumberOfBaseNodes
();
auto
const
chemical_system_map
=
*
phreeqc_io
.
_mesh
.
getProperties
()
.
template
getPropertyVector
<
std
::
size_t
>(
"bulk_node_ids"
,
MeshLib
::
MeshItemType
::
Node
,
1
);
for
(
std
::
size_t
local_id
=
0
;
local_id
<
num_chemical_systems
;
++
local_id
)
for
(
std
::
size_t
mesh_item_id
=
0
;
mesh_item_id
<
phreeqc_io
.
chemical_system_index_map
.
size
();
++
mesh_item_id
)
{
auto
const
global_id
=
chemical_system_map
[
local_id
];
os
<<
"SOLUTION "
<<
global_id
+
1
<<
"
\n
"
;
phreeqc_io
.
_chemical_system
->
aqueous_solution
->
print
(
os
,
local_id
);
auto
const
&
dump
=
phreeqc_io
.
_dump
;
if
(
dump
)
auto
const
&
local_chemical_system
=
phreeqc_io
.
chemical_system_index_map
[
mesh_item_id
];
for
(
std
::
size_t
ip
=
0
;
ip
<
local_chemical_system
.
size
();
++
ip
)
{
auto
const
&
aqueous_solutions_prev
=
dump
->
aqueous_solutions_prev
;
if
(
!
aqueous_solutions_prev
.
empty
())
auto
const
&
chemical_system_id
=
local_chemical_system
[
ip
];
os
<<
"SOLUTION "
<<
chemical_system_id
+
1
<<
"
\n
"
;
phreeqc_io
.
_chemical_system
->
aqueous_solution
->
print
(
os
,
chemical_system_id
);
auto
const
&
dump
=
phreeqc_io
.
_dump
;
if
(
dump
)
{
os
<<
aqueous_solutions_prev
[
local_id
]
<<
"
\n\n
"
;
auto
const
&
aqueous_solutions_prev
=
dump
->
aqueous_solutions_prev
;
if
(
!
aqueous_solutions_prev
.
empty
())
{
os
<<
aqueous_solutions_prev
[
chemical_system_id
]
<<
"
\n\n
"
;
}
}
}
os
<<
"USE solution none"
<<
"
\n
"
;
os
<<
"END"
<<
"
\n\n
"
;
os
<<
"USE solution none"
<<
"
\n
"
;
os
<<
"END"
<<
"
\n\n
"
;
os
<<
"USE solution "
<<
global
_id
+
1
<<
"
\n\n
"
;
os
<<
"USE solution "
<<
chemical_system
_id
+
1
<<
"
\n\n
"
;
auto
const
&
equilibrium_reactants
=
phreeqc_io
.
_chemical_system
->
equilibrium_reactants
;
if
(
!
equilibrium_reactants
.
empty
())
{
os
<<
"EQUILIBRIUM_PHASES "
<<
global_id
+
1
<<
"
\n
"
;
for
(
auto
const
&
equilibrium_reactant
:
equilibrium_reactants
)
auto
const
&
equilibrium_reactants
=
phreeqc_io
.
_chemical_system
->
equilibrium_reactants
;
if
(
!
equilibrium_reactants
.
empty
())
{
equilibrium_reactant
.
print
(
os
,
global_id
);
os
<<
"EQUILIBRIUM_PHASES "
<<
chemical_system_id
+
1
<<
"
\n
"
;
for
(
auto
const
&
equilibrium_reactant
:
equilibrium_reactants
)
{
equilibrium_reactant
.
print
(
os
,
chemical_system_id
);
}
os
<<
"
\n
"
;
}
os
<<
"
\n
"
;
}
auto
const
&
kinetic_reactants
=
phreeqc_io
.
_chemical_system
->
kinetic_reactants
;
if
(
!
kinetic_reactants
.
empty
())
{
os
<<
"KINETICS "
<<
global_id
+
1
<<
"
\n
"
;
for
(
auto
const
&
kinetic_reactant
:
kinetic_reactants
)
auto
const
&
kinetic_reactants
=
phreeqc_io
.
_chemical_system
->
kinetic_reactants
;
if
(
!
kinetic_reactants
.
empty
())
{
kinetic_reactant
.
print
(
os
,
global_id
);
os
<<
"KINETICS "
<<
chemical_system_id
+
1
<<
"
\n
"
;
for
(
auto
const
&
kinetic_reactant
:
kinetic_reactants
)
{
kinetic_reactant
.
print
(
os
,
chemical_system_id
);
}
os
<<
"-steps "
<<
phreeqc_io
.
_dt
<<
"
\n
"
<<
"
\n
"
;
}
os
<<
"-steps "
<<
phreeqc_io
.
_dt
<<
"
\n
"
<<
"
\n
"
;
}
auto
const
&
surface
=
phreeqc_io
.
_surface
;
if
(
!
surface
.
empty
())
{
os
<<
"SURFACE "
<<
global
_id
+
1
<<
"
\n
"
;
std
::
size_t
aqueous_solution_id
=
dump
->
aqueous_solutions_prev
.
empty
()
?
global
_id
+
1
:
num_chemical_systems
+
global_id
+
1
;
os
<<
"-equilibrate with solution "
<<
aqueous_solution_id
<<
"
\n
"
;
os
<<
"-
sites_units DENSITY"
<<
"
\n
"
;
os
<<
surface
<<
"
\n
"
;
os
<<
"SAVE solution "
<<
global
_id
+
1
<<
"
\n
"
;
}
auto
const
&
surface
=
phreeqc_io
.
_surface
;
if
(
!
surface
.
empty
())
{
os
<<
"SURFACE "
<<
chemical_system
_id
+
1
<<
"
\n
"
;
std
::
size_t
aqueous_solution_id
=
dump
->
aqueous_solutions_prev
.
empty
()
?
chemical_system
_id
+
1
:
phreeqc_io
.
_
num_chemical_systems
+
chemical_system_id
+
1
;
os
<<
"-
equilibrate with solution "
<<
aqueous_solution_id
<<
"
\n
"
;
os
<<
"-sites_units DENSITY"
<<
"
\n
"
;
os
<<
surface
<<
"
\n
"
;
os
<<
"SAVE solution "
<<
chemical_system
_id
+
1
<<
"
\n
"
;
}
os
<<
"END"
<<
"
\n\n
"
;
os
<<
"END"
<<
"
\n\n
"
;
}
}
auto
const
&
dump
=
phreeqc_io
.
_dump
;
if
(
dump
)
{
dump
->
print
(
os
,
num_chemical_systems
);
dump
->
print
(
os
,
phreeqc_io
.
_
num_chemical_systems
);
}
return
os
;
...
...
@@ -371,150 +373,157 @@ std::istream& operator>>(std::istream& in, PhreeqcIO& phreeqc_io)
auto
const
&
surface
=
phreeqc_io
.
_surface
;
int
const
num_skipped_lines
=
surface
.
empty
()
?
1
:
2
;
std
::
size_t
const
num_chemical_systems
=
phreeqc_io
.
_mesh
.
getNumberOfBaseNodes
();
auto
const
chemical_system_map
=
*
phreeqc_io
.
_mesh
.
getProperties
()
.
template
getPropertyVector
<
std
::
size_t
>(
"bulk_node_ids"
,
MeshLib
::
MeshItemType
::
Node
,
1
);
for
(
std
::
size_t
local_id
=
0
;
local_id
<
num_chemical_systems
;
++
local_id
)
for
(
std
::
size_t
mesh_item_id
=
0
;
mesh_item_id
<
phreeqc_io
.
chemical_system_index_map
.
size
();
++
mesh_item_id
)
{
auto
const
g
lo
b
al_
id
=
chemical_system
_map
[
local_id
];
// Skip equilibrium calculation result of initial solution
for
(
in
t
i
=
0
;
i
<
num_skipped_lines
;
++
i
)
auto
const
&
lo
c
al_chemical_system
=
phreeqc_io
.
chemical_system_index_map
[
mesh_item_id
];
for
(
std
::
size_
t
i
p
=
0
;
i
p
<
local_chemical_system
.
size
()
;
++
i
p
)
{
in
.
ignore
(
std
::
numeric_limits
<
std
::
streamsize
>::
max
(),
'\n'
);
}
auto
const
&
chemical_system_id
=
local_chemical_system
[
ip
];
// Get calculation result of the solution after the reaction
if
(
!
std
::
getline
(
in
,
line
))
{
OGS_FATAL
(
"Error when reading calculation result of Solution {:d} after "
"the reaction."
,
global_id
);
}
// Skip equilibrium calculation result of initial solution
for
(
int
i
=
0
;
i
<
num_skipped_lines
;
++
i
)
{
in
.
ignore
(
std
::
numeric_limits
<
std
::
streamsize
>::
max
(),
'\n'
);
}
std
::
vector
<
double
>
accepted_items
;
std
::
vector
<
std
::
string
>
items
;
boost
::
trim_if
(
line
,
boost
::
is_any_of
(
"
\t
"
));
boost
::
algorithm
::
split
(
items
,
line
,
boost
::
is_any_of
(
"
\t
"
),
boost
::
token_compress_on
);
for
(
int
item_id
=
0
;
item_id
<
static_cast
<
int
>
(
items
.
size
());
++
item_id
)
{
if
(
std
::
find
(
dropped_item_ids
.
begin
(),
dropped_item_ids
.
end
(),
item_id
)
==
dropped_item_ids
.
end
())
// Get calculation result of the solution after the reaction
if
(
!
std
::
getline
(
in
,
line
))
{
double
value
;
try
{
value
=
std
::
stod
(
items
[
item_id
]);
}
catch
(
const
std
::
invalid_argument
&
e
)
{
OGS_FATAL
(
"Invalid argument. Could not convert string '{:s}' to "
"double for chemical system {:d}, column {:d}. "
"Exception "
"'{:s}' was thrown."
,
items
[
item_id
],
global_id
,
item_id
,
e
.
what
());
}
catch
(
const
std
::
out_of_range
&
e
)
OGS_FATAL
(
"Error when reading calculation result of Solution {:d} "
"after "
"the reaction."
,
chemical_system_id
);
}
std
::
vector
<
double
>
accepted_items
;
std
::
vector
<
std
::
string
>
items
;
boost
::
trim_if
(
line
,
boost
::
is_any_of
(
"
\t
"
));
boost
::
algorithm
::
split
(
items
,
line
,
boost
::
is_any_of
(
"
\t
"
),
boost
::
token_compress_on
);
for
(
int
item_id
=
0
;
item_id
<
static_cast
<
int
>
(
items
.
size
());
++
item_id
)
{
if
(
std
::
find
(
dropped_item_ids
.
begin
(),
dropped_item_ids
.
end
(),
item_id
)
==
dropped_item_ids
.
end
())
{
OGS_FATAL
(
"Out of range error. Could not convert string '{:s}' "
"to "
"double for chemical system {:d}, column {:d}. "
"Exception "
"'{:s}' was thrown."
,
items
[
item_id
],
global_id
,
item_id
,
e
.
what
());
double
value
;
try
{
value
=
std
::
stod
(
items
[
item_id
]);
}
catch
(
const
std
::
invalid_argument
&
e
)
{
OGS_FATAL
(
"Invalid argument. Could not convert string '{:s}' "
"to double for chemical system {:d}, column {:d}. "
"Exception '{:s}' was thrown."
,
items
[
item_id
],
chemical_system_id
+
1
,
item_id
,
e
.
what
());
}
catch
(
const
std
::
out_of_range
&
e
)
{
OGS_FATAL
(
"Out of range error. Could not convert string "
"'{:s}' to double for chemical system {:d}, column "
"{:d}. Exception '{:s}' was thrown."
,
items
[
item_id
],
chemical_system_id
+
1
,
item_id
,
e
.
what
());
}
accepted_items
.
push_back
(
value
);
}
accepted_items
.
push_back
(
value
);
}
}
assert
(
accepted_items
.
size
()
==
output
.
accepted_items
.
size
());
auto
&
aqueous_solution
=
phreeqc_io
.
_chemical_system
->
aqueous_solution
;
auto
&
components
=
aqueous_solution
->
components
;
auto
&
equilibrium_reactants
=
phreeqc_io
.
_chemical_system
->
equilibrium_reactants
;
auto
&
kinetic_reactants
=
phreeqc_io
.
_chemical_system
->
kinetic_reactants
;
auto
&
user_punch
=
phreeqc_io
.
_user_punch
;
for
(
int
item_id
=
0
;
item_id
<
static_cast
<
int
>
(
accepted_items
.
size
());
++
item_id
)
{
auto
const
&
accepted_item
=
output
.
accepted_items
[
item_id
];
auto
const
&
item_name
=
accepted_item
.
name
;
assert
(
accepted_items
.
size
()
==
output
.
accepted_items
.
size
());
auto
&
aqueous_solution
=
phreeqc_io
.
_chemical_system
->
aqueous_solution
;
auto
&
components
=
aqueous_solution
->
components
;
auto
&
equilibrium_reactants
=
phreeqc_io
.
_chemical_system
->
equilibrium_reactants
;
auto
&
kinetic_reactants
=
phreeqc_io
.
_chemical_system
->
kinetic_reactants
;
auto
&
user_punch
=
phreeqc_io
.
_user_punch
;
for
(
int
item_id
=
0
;
item_id
<
static_cast
<
int
>
(
accepted_items
.
size
());
++
item_id
)
{
auto
const
&
accepted_item
=
output
.
accepted_items
[
item_id
];
auto
const
&
item_name
=
accepted_item
.
name
;
auto
compare_by_name
=
[
&
item_name
](
auto
const
&
item
)
{
return
item
.
name
==
item_name
;
};
auto
compare_by_name
=
[
&
item_name
](
auto
const
&
item
)
{
return
item
.
name
==
item_name
;
};
switch
(
accepted_item
.
item_type
)
{
case
ItemType
::
pH
:
switch
(
accepted_item
.
item_type
)
{
// Update pH value
aqueous_solution
->
pH
->
set
(
local_id
,
case
ItemType
::
pH
:
{
// Update pH value
aqueous_solution
->
pH
->
set
(
chemical_system_id
,
accepted_items
[
item_id
]);
break
;
}
case
ItemType
::
pe
:
{
// Update pe value
(
*
aqueous_solution
->
pe
)[
chemical_system_id
]
=
accepted_items
[
item_id
];
break
;
}
case
ItemType
::
Component
:
{
// Update component concentrations
auto
&
component
=
BaseLib
::
findElementOrError
(
components
.
begin
(),
components
.
end
(),
compare_by_name
,
"Could not find component '"
+
item_name
+
"'."
);
component
.
amount
->
set
(
chemical_system_id
,
accepted_items
[
item_id
]);
break
;
}
case
ItemType
::
pe
:
{
// Update pe value
(
*
aqueous_solution
->
pe
)[
global_id
]
=
accepted_items
[
item_id
];
break
;
}
case
ItemType
::
Component
:
{
// Update component concentrations
auto
&
component
=
BaseLib
::
findElementOrError
(
components
.
begin
(),
components
.
end
(),
compare_by_name
,
"Could not find component '"
+
item_name
+
"'."
);
component
.
amount
->
set
(
local_id
,
accepted_items
[
item_id
]);
break
;
}
case
ItemType
::
EquilibriumReactant
:
{
// Update amounts of equilibrium reactant
auto
&
equilibrium_reactant
=
BaseLib
::
findElementOrError
(
equilibrium_reactants
.
begin
(),
equilibrium_reactants
.
end
(),
compare_by_name
,
"Could not find equilibrium reactant '"
+
item_name
+
"'."
);
(
*
equilibrium_reactant
.
amount
)[
global_id
]
=
accepted_items
[
item_id
];
break
;
}
case
ItemType
::
KineticReactant
:
{
// Update amounts of kinetic reactants
auto
&
kinetic_reactant
=
BaseLib
::
findElementOrError
(
kinetic_reactants
.
begin
(),
kinetic_reactants
.
end
(),
compare_by_name
,
"Could not find kinetic reactant '"
+
item_name
+
"'."
);
(
*
kinetic_reactant
.
amount
)[
global_id
]
=
accepted_items
[
item_id
];
break
;
}
case
ItemType
::
SecondaryVariable
:
{
assert
(
user_punch
);
auto
&
secondary_variables
=
user_punch
->
secondary_variables
;
// Update values of secondary variables
auto
&
secondary_variable
=
BaseLib
::
findElementOrError
(
secondary_variables
.
begin
(),
secondary_variables
.
end
(),
compare_by_name
,
"Could not find secondary variable '"
+
item_name
+
"'."
);
(
*
secondary_variable
.
value
)[
global_id
]
=
accepted_items
[
item_id
];
break
;
break
;
}
case
ItemType
::
EquilibriumReactant
:
{
// Update amounts of equilibrium reactant
auto
&
equilibrium_reactant
=
BaseLib
::
findElementOrError
(
equilibrium_reactants
.
begin
(),
equilibrium_reactants
.
end
(),
compare_by_name
,
"Could not find equilibrium reactant '"
+
item_name
+
"'."
);
(
*
equilibrium_reactant
.
amount
)[
chemical_system_id
]
=
accepted_items
[
item_id
];
break
;
}
case
ItemType
::
KineticReactant
:
{
// Update amounts of kinetic reactants
auto
&
kinetic_reactant
=
BaseLib
::
findElementOrError
(
kinetic_reactants
.
begin
(),
kinetic_reactants
.
end
(),
compare_by_name
,
"Could not find kinetic reactant '"
+
item_name
+
"'."
);
(
*
kinetic_reactant
.
amount
)[
chemical_system_id
]
=
accepted_items
[
item_id
];
break
;
}
case
ItemType
::
SecondaryVariable
:
{
assert
(
user_punch
);
auto
&
secondary_variables
=
user_punch
->
secondary_variables
;
// Update values of secondary variables
auto
&
secondary_variable
=
BaseLib
::
findElementOrError
(
secondary_variables
.
begin
(),
secondary_variables
.
end
(),
compare_by_name
,
"Could not find secondary variable '"
+
item_name
+
"'."
);
(
*
secondary_variable
.
value
)[
chemical_system_id
]
=
accepted_items
[
item_id
];
break
;
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment