commit 96aa2eebf4bcfd710c073cd5487b4fff74e9467f
parent 1d6c1d47a62c5b6ccdf2a275339df7948652a123
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 19 Feb 2019 16:26:12 +0100
Handle the t0 medium parameter in sdis_green_function_solve
Diffstat:
2 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/src/sdis_green.c b/src/sdis_green.c
@@ -314,13 +314,21 @@ green_function_solve_path
flux += flux_terms[i].term * interface_side_get_flux(interf, &frag);
}
- /* Setup time. TODO handle t0 of the media */
+ /* Setup time. */
switch(path->limit_type) {
- case LIMIT_FRAGMENT: time_curr = time + path->limit.fragment.time; break;
- case LIMIT_VERTEX: time_curr = time + path->limit.vertex.time; break;
+ case LIMIT_FRAGMENT:
+ time_curr = time + path->limit.fragment.time;
+ interf = green_function_fetch_interf(green, path->limit_id);
+ break;
+ case LIMIT_VERTEX:
+ time_curr = time + path->limit.vertex.time;
+ medium = green_function_fetch_medium(green, path->limit_id);
+ break;
default: FATAL("Unreachable code.\n"); break;
}
- if(time_curr <= 0) {
+
+ if(time_curr <= 0
+ || (path->limit_type == LIMIT_VERTEX && time_curr <= medium_get_t0(medium))) {
log_err(green->dev,
"%s: invalid observation time \"%g\": the initial condition is reached "
"while instationary system are not supported by the green function.\n",
@@ -334,14 +342,12 @@ green_function_solve_path
case LIMIT_FRAGMENT:
frag = path->limit.fragment;
frag.time = time_curr;
- interf = green_function_fetch_interf(green, path->limit_id);
temperature = interface_side_get_temperature(interf, &frag);
break;
case LIMIT_VERTEX:
vtx = path->limit.vertex;
vtx.time = time_curr;
- medium = green_function_fetch_medium(green, path->limit_id);
- temperature = medium_get_temerature(medium, &vtx);
+ temperature = medium_get_temperature(medium, &vtx);
break;
default: FATAL("Unreachable code.\n"); break;
}
@@ -450,7 +456,7 @@ sdis_green_function_solve
npaths = darray_green_path_size_get(&green->paths);
/* Solve the green function */
- FOR_EACH(ipath, 0, npaths) { /* TODO add multi-threading */
+ FOR_EACH(ipath, 0, npaths) { /* TODO add multi-threading (?) */
const double time = sample_time(rng, time_range);
double w;
diff --git a/src/sdis_medium_c.h b/src/sdis_medium_c.h
@@ -143,7 +143,7 @@ solid_get_t0(const struct sdis_medium* mdm)
* Generic functions
******************************************************************************/
static FINLINE double
-medium_get_temerature
+medium_get_temperature
(const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx)
{
double temp;
@@ -156,5 +156,18 @@ medium_get_temerature
return temp;
}
+static FINLINE double
+medium_get_t0(const struct sdis_medium* mdm)
+{
+ double t0;
+ ASSERT(mdm);
+ switch(mdm->type) {
+ case SDIS_FLUID: t0 = fluid_get_t0(mdm); break;
+ case SDIS_SOLID: t0 = solid_get_t0(mdm); break;
+ default: FATAL("Unreachable code.\n"); break;
+ }
+ return t0;
+}
+
#endif /* SDIS_MEDIUM_C_H */