mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
well_controls: Add deep-copy (clone) support
New function well_controls_clone(), implemented in terms of the public API only, mirrors the objective of function clone_wells(), only for well control sets. Add a basic test to demonstrate the function too.
This commit is contained in:
@@ -22,7 +22,10 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
/**
|
||||
* @file
|
||||
* API for managing sets of well controls.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -42,6 +45,16 @@ well_controls_equal(const struct WellControls *ctrls1, const struct WellControls
|
||||
struct WellControls *
|
||||
well_controls_create(void);
|
||||
|
||||
/**
|
||||
* Create deep copy (clone) of an existing set of well controls.
|
||||
*
|
||||
* @param[in] ctrl Existing set of well controls.
|
||||
*
|
||||
* @return Deep copy of @c ctrl.
|
||||
*/
|
||||
struct WellControls *
|
||||
well_controls_clone(const struct WellControls *ctrl);
|
||||
|
||||
void
|
||||
well_controls_destroy(struct WellControls *ctrl);
|
||||
|
||||
|
||||
@@ -181,6 +181,65 @@ well_controls_reserve(int nctrl, struct WellControls *ctrl)
|
||||
}
|
||||
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
struct WellControls *
|
||||
well_controls_clone(const struct WellControls *ctrl)
|
||||
/* ---------------------------------------------------------------------- */
|
||||
{
|
||||
int ok, i, n;
|
||||
double target;
|
||||
const double *distr;
|
||||
struct WellControls *new;
|
||||
enum WellControlType type;
|
||||
|
||||
new = well_controls_create();
|
||||
|
||||
if (new != NULL) {
|
||||
/* Assign appropriate number of phases */
|
||||
well_controls_assert_number_of_phases(new, ctrl->number_of_phases);
|
||||
|
||||
n = well_controls_get_num(ctrl);
|
||||
ok = well_controls_reserve(n, new);
|
||||
|
||||
if (! ok) {
|
||||
well_controls_destroy(new);
|
||||
new = NULL;
|
||||
}
|
||||
else {
|
||||
for (i = 0; ok && (i < n); i++) {
|
||||
type = well_controls_iget_type (ctrl, i);
|
||||
distr = well_controls_iget_distr (ctrl, i);
|
||||
target = well_controls_iget_target(ctrl, i);
|
||||
|
||||
ok = well_controls_add_new(type, target, distr, new);
|
||||
}
|
||||
|
||||
if (i < n) {
|
||||
assert (!ok);
|
||||
well_controls_destroy(new);
|
||||
|
||||
new = NULL;
|
||||
}
|
||||
else {
|
||||
i = well_controls_get_current(ctrl);
|
||||
well_controls_set_current(new, i);
|
||||
|
||||
if (well_controls_well_is_open(ctrl)) {
|
||||
well_controls_open_well(new);
|
||||
}
|
||||
else {
|
||||
well_controls_shut_well(new);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assert (well_controls_equal(ctrl, new, true));
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
|
||||
int well_controls_get_num(const struct WellControls *ctrl) {
|
||||
return ctrl->num;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user