MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
twoTanksMacroscopicProblem.C
Go to the documentation of this file.
1 
41 #include <stdio.h>
42 #include <iostream>
43 #include "modena.h"
44 
45 using namespace std;
46 
47 int
48 main(int argc, char *argv[])
49 {
50  const double D = 0.01;
51 
52  double p0 = 3e5;
53  double p1 = 10000;
54  double V0 = 0.1;
55  double V1 = 1;
56  double T = 300;
57 
58  double t = 0.0;
59  const double deltat = 1e-3;
60  const double tend = 5.5;
61 
62  double m0 = p0*V0/287.1/T;
63  double m1 = p1*V1/287.1/T;
64 
65  double rho0 = m0/V0;
66  double rho1 = m1/V1;
67 
68 
69  // Instantiate a model
70  modena_model_t *model = modena_model_new("flowRate");
71 
72  if(modena_error_occurred())
73  {
74  return modena_error();
75  }
76 
77  // Allocate memory and fetch arg positions
78  modena_inputs_t *inputs = modena_inputs_new(model);
79  modena_outputs_t *outputs = modena_outputs_new(model);
80 
81  size_t Dpos = modena_model_inputs_argPos(model, "D");
82  size_t T0Pos = modena_model_inputs_argPos(model, "T0");
83  size_t p0Pos = modena_model_inputs_argPos(model, "p0");
84  size_t p1Byp0Pos = modena_model_inputs_argPos(model, "p1Byp0");
85 
87 
88  while(t + deltat < tend + 1e-10)
89  {
90  t += deltat;
91 
92  if(p0 > p1)
93  {
94  // Set input vector
95  modena_inputs_set(inputs, Dpos, D);
96  modena_inputs_set(inputs, T0Pos, T);
97  modena_inputs_set(inputs, p0Pos, p0);
98  modena_inputs_set(inputs, p1Byp0Pos, p1/p0);
99 
100  // Call the model
101  int ret = modena_model_call(model, inputs, outputs);
102 
103  // Terminate, if requested
104  if(modena_error_occurred())
105  {
106  modena_inputs_destroy(inputs);
107  modena_outputs_destroy(outputs);
108  modena_model_destroy(model);
109 
110  return modena_error();
111  }
112 
113  // Fetch result
114  double mdot = modena_outputs_get(outputs, 0);
115 
116  m0 -= mdot*deltat;
117  m1 += mdot*deltat;
118  }
119  else
120  {
121  // Set input vector
122  modena_inputs_set(inputs, Dpos, D);
123  modena_inputs_set(inputs, T0Pos, T);
124  modena_inputs_set(inputs, p0Pos, p1);
125  modena_inputs_set(inputs, p1Byp0Pos, p0/p1);
126 
127  // Call the model
128  int ret = modena_model_call(model, inputs, outputs);
129 
130  // Terminate, if requested
131  if(modena_error_occurred())
132  {
133  modena_inputs_destroy(inputs);
134  modena_outputs_destroy(outputs);
135  modena_model_destroy(model);
136 
137  return modena_error();
138  }
139 
140  // Fetch result
141  double mdot = modena_outputs_get(outputs, 0);
142 
143  m0 += mdot*deltat;
144  m1 -= mdot*deltat;
145  }
146 
147  rho0 = m0/V0;
148  rho1 = m1/V1;
149  p0 = m0/V0*287.1*T;
150  p1 = m1/V1*287.1*T;
151 
152  cout << "t = " << t << " rho0 = " << rho0 << " p0 = " << p0 << " p1 = " << p1 << endl;
153  }
154 
155  modena_inputs_destroy(inputs);
156  modena_outputs_destroy(outputs);
157  modena_model_destroy(model);
158 
159  return 0;
160 }
size_t modena_model_inputs_argPos(const modena_model_t *self, const char *name)
Function determining position of an argument in the input vector.
Definition: model.c:366
modena_model_t * modena_model_new(const char *modelId)
Function fetching a surrogate model from MongoDB.
Definition: model.c:281
int modena_model_call(modena_model_t *self, modena_inputs_t *inputs, modena_outputs_t *outputs)
Function calling the surrogate model and checking for errors.
Definition: model.c:553
int main(int argc, char *argv[])
Reads parameters. Creates struts and walls. Saves foam morphology to a file.
Definition: foams.cc:23
stores a surrogate model
Definition: model.h:94
void modena_model_destroy(modena_model_t *self)
Function deallocating the memory allocated for the surrogate model.
Definition: model.c:665
Definition: model.f90:7
double tend
end time, s
void modena_model_argPos_check(const modena_model_t *self)
Function checking that the user has queried all input positions.
Definition: model.c:408