if not periodic: sdf = pb.SDF_PlantBox(0.99 * (max_b[0] - min_b[0]), 0.99 * (max_b[1] - min_b[1]), max_b[2] - min_b[2]) else: sdf = pb.SDF_PlantBox(np.Inf, np.Inf, max_b[2] - min_b[2]) rs.setGeometry(sdf) rs.initialize() rs.simulate(rs_age, False) r = XylemFluxPython(rs) init_conductivities(r, age_dependent) """ Coupling (map indices) """ picker = lambda x, y, z: s.pick([x, y, z]) r.rs.setSoilGrid(picker) # maps segments r.rs.setRectangularGrid(pb.Vector3d(min_b), pb.Vector3d(max_b), pb.Vector3d(cell_number), True) r.test() # sanity checks nodes = r.get_nodes() cci = picker(nodes[0, 0], nodes[0, 1], nodes[0, 2]) # collar cell index """ Numerical solution """ start_time = timeit.default_timer() x_, y_ = [], [] sx = s.getSolutionHead() # inital condition, solverbase.py N = round(sim_time / dt) t = 0. for i in range(0, N): rx = r.solve(rs_age + t, -trans * sinusoidal(t), sx[cci], sx, True, wilting_point) # xylem_flux.py x_.append(t) y_.append(float(r.collar_flux(rs_age + t, rx, sx)))
rs.simulate(simtime, False) """ set up xylem parameters """ r = XylemFluxPython(rs) # defaults... kr4 = kr1 # basal kr5 = kr1 # shoot borne kz4 = kz1 kz5 = kz1 r.setKrTables( [kr0[:, 1], kr1[:, 1], kr2[:, 1], kr3[:, 1], kr4[:, 1], kr5[:, 1]], [kr0[:, 0], kr1[:, 0], kr2[:, 0], kr3[:, 0], kr4[:, 0], kr5[:, 0]]) r.setKxTables( [kz0[:, 1], kz1[:, 1], kz2[:, 1], kz3[:, 1], kz4[:, 1], kz5[:, 1]], [kz0[:, 0], kz1[:, 0], kz2[:, 0], kz3[:, 0], kz4[:, 0], kz5[:, 0]]) """ for debugging """ r.test() r.plot_conductivities() shoot_segs = rs.getShootSegments() print("Shoot segments", [str(s) for s in shoot_segs]) print("Shoot type", rs.subTypes[0]) jc_, krs_, l_, eswp_, suf_ = [], [], [], [], [] """ numerical solution of transpiration -1 cm3/day""" simtime += 1 for t in range(10, simtime): suf = r.get_suf(t) krs, _ = r.get_krs(t) krs_.append(krs) if t > 10 and t % 10 == 0: