diff --git a/Homework4/src/main.py b/Homework4/src/main.py index 02b2cf6..efe46d2 100644 --- a/Homework4/src/main.py +++ b/Homework4/src/main.py @@ -1,100 +1,98 @@ #!/bin/env python3 import sys import argparse import pypart -from pypart import * -""" + from pypart import MaterialPointsFactory, ParticlesFactoryInterface from pypart import PingPongBallsFactory, PlanetsFactory from pypart import CsvWriter from pypart import ComputeTemperature from pypart import ComputeGravity from pypart import ComputeVerletIntegration -""" # help(pypart) def main(nsteps,freq,filename,particle_type,timestep): #print(pypart.__file__) if particle_type == "planet": PlanetsFactory.getInstance() elif particle_type == "ping_pong": PingPongBallsFactory.getInstance() elif particle_type == "material_point": MaterialPointsFactory.getInstance() else: print("Unknown particle type: ", particle_type) sys.exit(-1) factory = ParticlesFactoryInterface.getInstance() def createComputes(self, timestep): if particle_type == "planet": try: compute_grav = ComputeGravity() compute_verlet = ComputeVerletIntegration(timestep) G = 6.67384e-11 # m^3 * kg^-1 * s^-2 UA = 149597870.700 # km earth_mass = 5.97219e24 # kg G /= (UA * 1e3)**3 # UA^3 * kg^-1 * s^-2 G *= earth_mass # UA^3 * earth_mass^-1 * s^-2 G *= (60*60*24)**2 # UA^3 * earth_mass^-1 * day^-2 compute_grav.setG(G) compute_verlet.addInteraction(compute_grav) self.system_evolution.addCompute(compute_verlet) except Exception as e: help(compute_grav) raise e elif particle_type == 'material_points': try: compute_temp = ComputeTemperature() compute_temp.conductivity = 1 compute_temp.L = 2 compute_temp.capacity = 1 compute_temp.density = 1 compute_temp.deltat = 1 self.system_evolution.addCompute(compute_temp) except Exception as e: help(compute_temp) raise e evol = factory.createSimulation(filename, timestep, createComputes) dumper = CsvWriter("out.csv") dumper.write(evol.getSystem()) evol.setNSteps(nsteps) evol.setDumpFreq(freq) evol.evolve() if __name__ == "__main__": parser = argparse.ArgumentParser(description='Particles code') parser.add_argument('nsteps', type=int, help='specify the number of steps to perform') parser.add_argument('freq', type=int, help='specify the frequency for dumps') parser.add_argument('filename', type=str, help='start/input filename') parser.add_argument('particle_type', type=str, help='particle type') parser.add_argument('timestep', type=float, help='timestep') args = parser.parse_args() nsteps = args.nsteps freq = args.freq filename = args.filename particle_type = args.particle_type timestep = args.timestep #main(nsteps,freq,filename,particle_type,timestep) diff --git a/Homework4/src/pypart.cc b/Homework4/src/pypart.cc index 28337f1..892bc8e 100644 --- a/Homework4/src/pypart.cc +++ b/Homework4/src/pypart.cc @@ -1,132 +1,140 @@ #include #include #include #include #include "my_types.hh" #include "fft.hh" #include "system_evolution.hh" #include "particles_factory_interface.hh" #include "material_points_factory.hh" #include "planets_factory.hh" #include "ping_pong_balls_factory.hh" #include "csv_writer.hh" #include "compute.hh" #include "compute_temperature.hh" namespace py = pybind11; PYBIND11_MODULE(pypart, m) { m.doc() = "Python binding for the particles code."; // ========== Class System ================================================================== py::class_(m, "System"); // ========== Class SystemEvolution ========================================================= py::class_>(m, "SystemEvolution", py::dynamic_attr()) .def(py::init([](std::unique_ptr()){return std::unique_ptr();}), py::return_value_policy::move) .def("evolve", &SystemEvolution::evolve) .def("addCompute", &SystemEvolution::addCompute) .def("getSystem", &SystemEvolution::getSystem, py::return_value_policy::reference) .def("setNSteps", &SystemEvolution::setNSteps) .def("setDumpFreq", &SystemEvolution::setDumpFreq); // ========== Class ParticlesFactoryInterface =============================================== py::class_(m, "ParticlesFactoryInterface", py::dynamic_attr()) .def_static("getInstance", &ParticlesFactoryInterface::getInstance, py::return_value_policy::reference) .def("getSystemEvolution", &ParticlesFactoryInterface::getSystemEvolution, py::return_value_policy::reference) .def_property_readonly("system_evolution", &ParticlesFactoryInterface::getSystemEvolution); // ========== Class MaterialPointsFactory =================================================== py::class_(m, "MaterialPointsFactory", py::dynamic_attr()) .def_static("getInstance", &MaterialPointsFactory::getInstance, py::return_value_policy::reference) .def("createSimulation", (SystemEvolution& (MaterialPointsFactory::*)(const std::string &,Real)) &MaterialPointsFactory::createSimulation, py::return_value_policy::reference) .def("createSimulation", (SystemEvolution& (MaterialPointsFactory::*)(const std::string &,Real,py::object)) &MaterialPointsFactory::createSimulation, py::return_value_policy::reference); // ========== Class PlanetsFactory ========================================================== py::class_(m, "PlanetsFactory", py::dynamic_attr()) .def_static("getInstance", &PlanetsFactory::getInstance, py::return_value_policy::reference) .def("createSimulation", (SystemEvolution& (PlanetsFactory::*)(const std::string &,Real)) &PlanetsFactory::createSimulation, py::return_value_policy::reference) .def("createSimulation", (SystemEvolution& (PlanetsFactory::*)(const std::string &,Real,py::object)) &PlanetsFactory::createSimulation, py::return_value_policy::reference); // ========== Class PingPongBallsFactory ==================================================== py::class_(m, "PingPongBallsFactory", py::dynamic_attr()) .def_static("getInstance", &PingPongBallsFactory::getInstance, py::return_value_policy::reference) .def("createSimulation", (SystemEvolution& (PingPongBallsFactory::*)(const std::string &, Real)) &PingPongBallsFactory::createSimulation, py::return_value_policy::reference) .def("createSimulation",(SystemEvolution& (PingPongBallsFactory::*)(const std::string &, Real, py::object)) &PingPongBallsFactory::createSimulation, py::return_value_policy::reference); // ========== Class Compute ================================================================= py::class_>(m, "Compute"); class Pycompute : public Compute{ public: using Compute::Compute; void compute(System &system) override{ PYBIND11_OVERLOAD_PURE(void, Compute, compute, system); } }; // ========== Class ComputeTemperature ====================================================== py::class_>(m, "ComputeTemperature", py::dynamic_attr()) .def(py::init<>()) .def("compute", &ComputeTemperature::compute, py::return_value_policy::reference) .def_property_readonly("conductivity", &ComputeTemperature::getConductivity) .def_property_readonly("capacity", &ComputeTemperature::getCapacity) .def_property_readonly("density", &ComputeTemperature::getDensity) .def_property_readonly("L", &ComputeTemperature::getL) .def_property_readonly("deltat", &ComputeTemperature::getDeltat); + // ========== Class ComputeGravity ========================================================== + + + + // ========== Class ComputeVerletIntegration ================================================ + + + // ========== Class CsvWriter =============================================================== py::class_>(m,"CsvWriter") .def(py::init()) .def("write", &CsvWriter::write); }