pyiron - an integrated development environment (IDE) for computational materials science.

Overview

pyiron

Coverage Status Codacy Badge Release_Date Build Status Downloads Documentation Status

Screenshot of pyiron running inside jupyterlab.

pyiron - an integrated development environment (IDE) for computational materials science. It combines several tools in a common platform:

  • Atomic structure objects – compatible to the Atomic Simulation Environment (ASE).
  • Atomistic simulation codes – like LAMMPS and VASP.
  • Feedback Loops – to construct dynamic simulation life cycles.
  • Hierarchical data management – interfacing with storage resources like SQL and HDF5.
  • Integrated visualization – based on NGLview.
  • Interactive simulation protocols - based on Jupyter notebooks.
  • Object oriented job management – for scaling complex simulation protocols from single jobs to high-throughput simulations.

pyiron (called pyron) is developed in the Computational Materials Design department of Joerg Neugebauer at the Max Planck Institut für Eisenforschung (Max Planck Institute for iron research). While its original focus was to provide a framework to develop and run complex simulation protocols as needed for ab initio thermodynamics it quickly evolved into a versatile tool to manage a wide variety of simulation tasks. In 2016 the Interdisciplinary Centre for Advanced Materials Simulation (ICAMS) joined the development of the framework with a specific focus on high throughput applications. In 2018 pyiron was released as open-source project. See the Documentation page for more details.

Installation

You can test pyiron on Mybinder.org (beta). For a local installation we recommend to install pyiron inside an anaconda environment:

conda install -c conda-forge pyiron

After the installation of pyiron you need to configure pyiron. The default configuration can be generated automatically. Start a new Python session and import pyiron:

> import pyiron
> pyiron.install()
>>> It appears that pyiron is not yet configured, do you want to create a default start configuration (recommended: yes). [yes/no]:
> yes
> exit()

See the Documentation-Installation page for more details.

Example

After the successful configuration you can start your first pyiron calculation. Navigate to the projects directory and start a jupyter notebook or jupyter lab session correspondingly:

cd ~/pyiron/projects
jupyter notebook

Open a new jupyter notebook and inside the notebook you can now validate your pyiron calculation by creating a test project, setting up an initial structure of bcc Fe and visualize it using NGLview:

from pyiron_atomistics import Project
pr = Project('test')
structure = pr.create_structure('Fe', 'bcc', 2.78)
structure.plot3d()

Finally a first lammps calculation can be executed by:

job = pr.create_job(job_type=pr.job_type.Lammps, job_name='lammpstestjob')
job.structure = structure
job.potential = job.list_potentials()[0]
job.run()

Getting started:

Test pyiron with mybinder:

mybinder

License and Acknowledgments

pyiron is licensed under the BSD license.

If you use pyiron in your scientific work, please consider citing

@article{pyiron-paper,
  title = {pyiron: An integrated development environment for computational materials science},
  journal = {Computational Materials Science},
  volume = {163},
  pages = {24 - 36},
  year = {2019},
  issn = {0927-0256},
  doi = {https://doi.org/10.1016/j.commatsci.2018.07.043},
  url = {http://www.sciencedirect.com/science/article/pii/S0927025618304786},
  author = {Jan Janssen and Sudarsan Surendralal and Yury Lysogorskiy and Mira Todorova and Tilmann Hickel and Ralf Drautz and Jörg Neugebauer},
  keywords = {Modelling workflow, Integrated development environment, Complex simulation protocols},
}
Comments
  • libmpi not found

    libmpi not found

    Sorry it's an MPIE problem, but LAMMPS doesn't seem to be able to find the shared library for the interactive job:

    libmpi.so.40: cannot open shared object file: No such file or directory
    
    bug 
    opened by samwaseda 31
  •  `view_potentials` is not listing potentials

    `view_potentials` is not listing potentials

    from pyiron import Project
    
    pr = Project("scratch")
    
    job = pr.create.job.Lammps("LammpsJob")
    
    job.structure = pr.create.structure.bulk("Ni", cubic=True)
    
    job.view_potentials()
    

    Problem : Doesn't show the list of potentials for the structure in lammps calculation (screenshot attached below). I had used the notebook in the garching cluster(using cmti login). It seems to work for Al as described by @liamhuber and only shows 2 potentials . But don't know why not for Ni and also tried by modifying the structure doc string by providing crystalstructure and lattice constant. It still doesn't show.

    view_potential_problem

    bug 
    opened by Vishwa-adi 31
  • Vasp options

    Vasp options

    Amendments to #769.

    A new field on vasp input is created, the DataContainer code_specific_options, which in this case stores the flag allowing the structure order to preserved (which is the meat of #769).

    Still needs tests.

    format_black 
    opened by liamhuber 26
  • Running VASP interactively throws a BrokenPipeError

    Running VASP interactively throws a BrokenPipeError

    The following code:

    job = pr.create.job.Vasp('vasp_job')
    job.structure = pr.create.structure.ase.bulk('Al', cubic=True).repeat(2)
    job.set_kpoints(mesh=[3,3,3])
    job.set_encut(encut=250.)
    job.calc_static()
    job.server.cores = 3
    job.interactive_open()
    for i in np.arange(3):
        print(i)
        job.run()
    job.interactive_close()
    

    throws the following error:

    BrokenPipeError                           Traceback (most recent call last)
    <ipython-input-9-3c3d382797c1> in <module>
          7 for i in np.arange(3):
          8     print(i)
    ----> 9     job.run()
         10 job.interactive_close()
    
    ~/pyiron_repos/pyiron_base/pyiron_base/generic/util.py in decorated(*args, **kwargs)
        211                         stacklevel=2
        212                     )
    --> 213             return function(*args, **kwargs)
        214         return decorated
        215 
    
    ~/pyiron_repos/pyiron_base/pyiron_base/job/generic.py in run(self, delete_existing_job, repair, debug, run_mode, run_again)
        665                 self._run_if_submitted()
        666             elif status == "running":
    --> 667                 self._run_if_running()
        668             elif status == "collect":
        669                 self._run_if_collect()
    
    ~/pyiron_repos/pyiron_base/pyiron_base/job/interactive.py in _run_if_running(self)
        163         """
        164         if self.server.run_mode.interactive:
    --> 165             self.run_if_interactive()
        166         elif self.server.run_mode.interactive_non_modal:
        167             self.run_if_interactive_non_modal()
    
    ~/pyiron_repos/pyiron_atomistics/pyiron_atomistics/vasp/interactive.py in run_if_interactive(self)
        255 
        256     def run_if_interactive(self):
    --> 257         self.run_if_interactive_non_modal()
        258         self._interactive_check_output()
        259         self._interactive_vasprun = Outcar()
    
    ~/pyiron_repos/pyiron_atomistics/pyiron_atomistics/vasp/interactive.py in run_if_interactive_non_modal(self)
        251                     self._logger.debug("Vasp library: " + text)
        252                     self._interactive_library.stdin.write(text + "\n")
    --> 253             self._interactive_library.stdin.flush()
        254         self._interactive_fetch_completed = False
        255 
    
    BrokenPipeError: [Errno 32] Broken pipe
    

    Has anyone come across this error before? Is this related to #216?

    bug help wanted 
    opened by raynol-dsouza 23
  • More structures

    More structures

    Adding Laves phase creation routines onto the structure factory.

    So far I did C15, although there might be a more elegant way to create the sublattices.

    C14 and C36 should look similar, including some tests to make sure they're working.

    enhancement 
    opened by liamhuber 21
  • ElasticTensor bug when use_pressure=False

    ElasticTensor bug when use_pressure=False

    Summary Elastic Tensor jobs work using pressure, but not using energy my strructures. When the "use_pressure" = False option is set they throw:

    _fit_coeffs_with_energies(strain, energy, volume, rotations, max_polynomial_order, fit_first_order)
        150     coeff = np.triu(np.ones((6,6))).flatten()
        151     # Multiply upper triangle with upper triangle coeffs (v.s.)
    --> 152     coeff[coeff!=0] *= reg.coef_[:21]*eV_div_A3_to_GPa
        153     coeff = coeff.reshape(6,6)
        154     coeff = 0.5*(coeff+coeff.T)
    
    ValueError: operands could not be broadcast together with shapes (21,) (18,) (21,) 
    

    Steps to Reproduce

    Run a ElasticTensor calculation with the attached structure (lammps format, original atom types are Cu and Zr, but that shouldn't matter I guess) using the use_pressure=False option. structure.txt

    bug 
    opened by Leimeroth 18
  • Allow to transform Trajectories

    Allow to transform Trajectories

    Use it in animate_structure to allow for repeated structures.

    I've just quickly checked this manually. @skatnagallu, please give it another check as well. Also if you have time/interest I think it'd be a good exercise to add simple unit tests to TransformTrajectory. ;)

    We might think about exposing the transform function from animate_structure to allow for more fancy visualizations, but I'll leave until someone has an application.

    Fixes #565.

    enhancement format_black 
    opened by pmrv 17
  • Quasi newton

    Quasi newton

    This class essentially does the same as SxExtOpt. Major differences:

    • It has more Hessian update schemes, esp. the ones that allow saddle point calculations.
    • It's our own QN code, meaning we can implement more detailed tools when needed
    • The Hessian matrix can be given beforehand, so that we can pre-determine a Hessian matrix with LAMMPS and then launch a DFT calculation (which, hopefully, will then require only a few steps).
    format_black 
    opened by samwaseda 16
  • Unable to run Lammps job in pyiron

    Unable to run Lammps job in pyiron

    I am getting the following error while tried to run a Lammps job with pyiron. This is just a example md job as given in the pyiron tutorial examples. I have run the same job successfully before. Please have a look in to it. The error is as follows:

    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    /tmp/ipykernel_36408/4143958703.py in <module>
    ----> 1 job.run()
    
    /u/system/SLES12/soft/pyiron/dev/anaconda3/lib/python3.7/site-packages/pyiron_base/generic/util.py in decorated(*args, **kwargs)
        211                         stacklevel=2
        212                     )
    --> 213             return function(*args, **kwargs)
        214         return decorated
        215 
    
    /u/system/SLES12/soft/pyiron/dev/anaconda3/lib/python3.7/site-packages/pyiron_base/job/generic.py in run(self, delete_existing_job, repair, debug, run_mode, run_again)
        663                 self._run_if_repair()
        664             elif status == "initialized":
    --> 665                 self._run_if_new(debug=debug)
        666             elif status == "created":
        667                 self._run_if_created()
    
    /u/system/SLES12/soft/pyiron/dev/anaconda3/lib/python3.7/site-packages/pyiron_base/job/generic.py in _run_if_new(self, debug)
       1311             print("job exists already and therefore was not created!")
       1312         else:
    -> 1313             self.save()
       1314             self.run()
       1315 
    
    /u/system/SLES12/soft/pyiron/dev/anaconda3/lib/python3.7/site-packages/pyiron_base/job/generic.py in save(self)
       1163         if self._check_if_input_should_be_written():
       1164             self.project_hdf5.create_working_directory()
    -> 1165             self.write_input()
       1166             _copy_restart_files(job=self)
       1167         self.status.created = True
    
    /u/system/SLES12/soft/pyiron/dev/anaconda3/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py in write_input(self)
        377             file_name="potential.inp", cwd=self.working_directory
        378         )
    --> 379         self.input.potential.copy_pot_files(self.working_directory)
        380 
        381     def _get_executable_version_number(self):
    
    /u/system/SLES12/soft/pyiron/dev/anaconda3/lib/python3.7/site-packages/pyiron_atomistics/lammps/potential.py in copy_pot_files(self, working_directory)
         92 
         93     def copy_pot_files(self, working_directory):
    ---> 94         if self.files is not None:
         95             _ = [shutil.copy(path_pot, working_directory) for path_pot in self.files]
         96 
    
    /u/system/SLES12/soft/pyiron/dev/anaconda3/lib/python3.7/site-packages/pyiron_atomistics/lammps/potential.py in files(self)
         84                     path=path,
         85                     resource_path_lst=resource_path_lst,
    ---> 86                     rel_path=os.path.join("lammps", "potentials")
         87                 ))
         88             if len(absolute_file_paths) != len(list(self._df["Filename"])[0]):
    
    /u/system/SLES12/soft/pyiron/dev/anaconda3/lib/python3.7/site-packages/pyiron_atomistics/atomistics/job/potentials.py in find_potential_file_base(path, resource_path_lst, rel_path)
        204                 return path_indirect
        205     raise ValueError("Either the filename or the functional has to be defined.",
    --> 206                      path, resource_path_lst)
    
    ValueError: ('Either the filename or the functional has to be defined.', 'AlCaMg_potential/library.meam,AlCaMg_potential/AlCaMg.meam', ['/u/system/SLES12/soft/pyiron/dev/pyiron-resources-cmmc', '/u/system/SLES12/soft/pyiron/dev/anaconda3/share/pyiron', '/u/system/SLES12/soft/pyiron/dev/anaconda3/share/iprpy', '/u/system/SLES12/soft/pyiron/dev/anaconda3/share/iprpy', '/u/system/SLES12/soft/pyiron/dev/anaconda3/share/iprpy', '/u/system/SLES12/soft/pyiron/dev/anaconda3/share/iprpy'])
    
    opened by usaikia 16
  • GPAW: Needs separate environment variable

    GPAW: Needs separate environment variable

    Right now on our cluster, if one tries to run a gpaw calculation it fails because the GPAW_SETUP_PATH environment variable is not set. I guess we should set this variable to /cmmc/u/system/SLES12/soft/pyiron/dev/anaconda3/share/gpaw in the pyiron module definition (that is the cluster module shell file).

    opened by pmrv 15
  • Add Wrapper for Atomsk Structure Creation

    Add Wrapper for Atomsk Structure Creation

    It turned out to be quite simple, so I've added it here instead of a new repo. I'll brush up the docstrings a bit and add examples and tests I got from @zhuochengXIE, but the main funtionality is there.

    enhancement 
    opened by pmrv 15
  • Tests are probably  failing because of numpy 1.24

    Tests are probably failing because of numpy 1.24

    Summary

    See https://github.com/pyiron/pyiron/actions/runs/3830658336/jobs/6522025658#step:6:1652

    There is not an np.float in numpy 1.24. The preferred usage is just float I think, e.g. instead of

    dtype_dict[v] = np.float

    use

    dtype_dict[v] = float

    alternatively, this in not recommended, but works fast; in the code, add this near the top: np.float = float.

    bug 
    opened by jkitchin 3
  • Problems_in_collecting_VASP_magnetic_moments

    Problems_in_collecting_VASP_magnetic_moments

    Dear PYIRON Community, I am facing a few issues in collecting the magnetic moments from the VASP simulations.

    ERROR: File "~/Apps/Test_Pyiron/lib/python3.11/site-packages/pyiron_atomistics/vasp/base.py", line 2014, in collect magnetization = np.array(self.outcar.parse_dict["magnetization"]).copy() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (5,) + inhomogeneous part.

    I did solve it by;

    1. By downgrading the NumPy version from 1.24.1 to 1.23.4, which also requires the downgrading of pyiron_atomistics to 0.2.58.

    or

    1. By changing the few lines in the base.py file (below)

    magnetization = np.array(self.outcar.parse_dict["magnetization"]).copy final_magmoms = np.array(self.outcar.parse_dict["final_magmoms"]).copy

    changes to

    magnetization = np.array(self.outcar.parse_dict["magnetization"], dtype=object, copy=True) final_magmoms = np.array(self.outcar.parse_dict["final_magmoms"], dtype=object, copy=True)

    Though I am not an expert in PYIRON and/or Python. Let me know about the possible corrections. Many thanks! Sourabh

    (https://drive.google.com/file/d/1WMJFuSZsYTje3982L1TX0gIrgFTUjjYU/view?usp=sharing)

    bug 
    opened by sourabh27 1
  • NumPy version 1.24.0 pr.create_job not working

    NumPy version 1.24.0 pr.create_job not working

    Summary

    NumPy version 1.24.0 removed np.float and np.int, AttributeError leads to "pr.create_job" not working.

    pyiron Version and Platform

    Installation done following instructions on website. https://pyiron.readthedocs.io/en/latest/source/installation.html Configuration was not changed. Versions: pyiron 0.4.7 pyiron-data 0.0.20 pyiron_atomistics 0.2.58 pyiron_base 0.5.30

    Expected Behavior

    pr.create_job(job_type=pr.job_type.Lammps, job_name='Al_T800K') working properly. (see below)

    Actual Behavior and Steps to Reproduce

    After fresh install. Following the steps under https://pyiron.readthedocs.io/en/latest/source/notebooks/first_steps.html#Perform-a-LAMMPS-MD-simulation I encountered a deprecation warning and a bug. First of all, pyiron states that "pr.create_ase_bulk" is deprecated. I guess one should use "pr.create.structure.bulk".

    Secondly, "job = pr.create_job(job_type=pr.job_type.Lammps, job_name='Al_T800K')" is not working. An AttributeError popped up, stating at the very bottom: "AttributeError: module 'numpy' has no attribute 'float'".

    Downgrading the NumPy-version to the latest before 1.24.0, which is 1.23.5, solved the issue (conda install -c conda-forge numpy=1.23.5). The reason being that NumPy removed np.float (and np.int) in version 1.24.0.

    Following the path of the error, which is: "...\anaconda3\envs\testMD\lib\site-packages\pyiron_atomistics\lammps\units.py:160" one gets to the file units.py. Copying this file to windows subsystem for linux and using "grep np.float units.py" in a directory only containing units.py to find other instances, one gets: "dtype_dict[v] = np.float" which is the instance python reports in line 160. Optional fix without downgrading NumPy to version 1.23.5: dtype_dict[v] = float Afterwards a new error appeared 2 lines above, "AttributeError: module 'numpy' has no attribute 'int'". Optional fix without downgrading NumPy to version 1.23.5: dtype_dict[v] = int

    bug 
    opened by co-dani-f 1
  • Deprecation warning about ragged nested sequences in the vasp module

    Deprecation warning about ragged nested sequences in the vasp module

    Reminder for myself to fix at some point

    /cmmc/u/hmai/github_dev_pyiron/pyiron_atomistics/pyiron_atomistics/vasp/base.py:2148: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray. magnetization = np.array(self.outcar.parse_dict["magnetization"]).copy()

    bug 
    opened by ligerzero-ai 0
  • SPHInX interface: passing changes to generic input down the line to SPHInX input tree

    SPHInX interface: passing changes to generic input down the line to SPHInX input tree

    Summary

    Once the SPHInX input tree (job.input.sphinx) is created, changes to input top-level settings have no effect. This could be fixed by registering call-backs when modifying input top-level settings.

    Detailed Description

    The current process of generating the SPHInX input tree (job.input.sphinx) at some not-so-clear point during job setup makes it difficult to ensure that all settings are correctly applied - in practice, the user may need to respect a particular order of settings to get the desired result.

    Example:

    job_bs = job_charge.restart_from_charge_density (...)
    job.input["nSloppy"] = 6
    

    The nSloppy setting has no effect, because restart_... comes with a complete tree.

    Suggested solution:

    1. Overload the __set_item__ function of job.input by something that supports key-based callbacks.
    2. Register callbacks for generic settings that influence the SPHInX input tree while creating the latter
    3. The callbacks could either auto-update or warn on mismatch.

    Technical sketch

    • input would get a dict _callbacks that maps keys to a list of callbacks. Before setting a new value for a key, _callbacks is checked for an entry and if available, the callbacks are called
    • callback signature would be (input object, key, value)
    • callbacks can use exceptions to modify setting behavior:
      • StopIteration if no further callbacks should be processed
      • LookupError (or KeyError?) if callback should be removed from callback list
      • any other Exception to prevent setting of the item
    • have a standard update callback class (callable) with the following behavior
      • has a member tree-path to the affected setting within the input.sphinx hierarchy
      • tree-path in combination with the first argument of the callback allows to access the actual setting
      • checks if this setting (still) exists. If not (and not set to "auto-generate"), it will throw LookupError to remove the callback
      • compares the current value of the tree-path setting with the new value. If same, will return
      • updates the tree-path setting with the new value and returns
      • if the tree-path has not a unique end-point (e.g., if several groups with the same name exist), it will affect all endpoints
    • installing the update could be wrapped to a nice-looking function, e.g.,
       self.input.link_setting ("nSloppy", "main/.../scfDiag/blockCCG/nSloppy")
    
    • in principle, it would be nice to extend this also to the _generic_input settings, but then the original and linked setting live in different containers, so it may be a bit more painstaking to pass the correct container if things are copied around. In the worst case, one may need to make sphinx_job.input live inside _generic_input rather than next to it, and make input a property to maintain the external interface
    • probably need some mechanism to make callbacks savable to hdf5. Probably as an additional (optional) property of the callback object that generates hdf-savable output, which could then be processed by a callback factory upon reading?

    My concerns Are there any objections against such a mechanism? Is there any better (less complex) solution that would maintain the flexibility of access to all SPHInX features (input tree) while maintaining consistency with generic DFT settings? Is this compatible with pyiron philosophy? A possible alternative would be to introduce "link" objects into the SPHInX input tree that would be resolved at writing time. However, this would make conditionally generated parts of the input tree a lot more complicated.

    enhancement 
    opened by freyso 1
Releases(pyiron_atomistics-0.2.61)
  • pyiron_atomistics-0.2.61(Dec 6, 2022)

    What's Changed

    • Bugfixes in StructurePlot and error handling for Atoms.get_symmetry by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/812
    • Bump pymatgen from 2022.10.22 to 2022.11.1 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/857
    • Bump matplotlib from 3.6.1 to 3.6.2 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/858
    • Bump spglib from 2.0.1 to 2.0.2 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/855
    • Bump pyiron-base from 0.5.27 to 0.5.28 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/856
    • Fixes outcar parsing for VASP >6.1.0 by @ligerzero-ai in https://github.com/pyiron/pyiron_atomistics/pull/864
    • Bump mp-api from 0.29.3 to 0.29.4 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/872
    • Bump pymatgen from 2022.11.1 to 2022.11.7 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/870
    • [minor] replace first name blabla by child name in serial master by @samwaseda in https://github.com/pyiron/pyiron_atomistics/pull/874
    • Bump mp-api from 0.29.4 to 0.29.7 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/876
    • Bump numpy from 1.23.4 to 1.23.5 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/875
    • setup: Add more folders to exclude list by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/877
    • Simplify get_elements by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/860
    • Allow to configure strains used in Murnaghan by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/816
    • Bump pyiron-base from 0.5.28 to 0.5.29 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/882
    • Bump pandas from 1.5.1 to 1.5.2 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/884
    • Bump mp-api from 0.29.7 to 0.29.8 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/883
    • Bump mendeleev from 0.11.0 to 0.12.1 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/891
    • make lazy input standard by @samwaseda in https://github.com/pyiron/pyiron_atomistics/pull/588
    • Rename master to main by @liamhuber in https://github.com/pyiron/pyiron_atomistics/pull/894

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.60...pyiron_atomistics-0.2.61

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.60(Nov 24, 2022)

    What's Changed

    • [minor] add warning when job already compressed by @samwaseda in https://github.com/pyiron/pyiron_atomistics/pull/849
    • Add methods to convert MP results to StructureStorage/list by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/846
    • Check for negative occupation by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/847
    • Bump pint from 0.19.2 to 0.20.1 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/850
    • Codacy only for PRs, continue on error by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/852
    • Bump scikit-learn from 1.1.2 to 1.1.3 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/851
    • StructureStorage: do not add extra elements by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/848
    • Adding animate method to Trajectory by @prince-mathews in https://github.com/pyiron/pyiron_atomistics/pull/853
    • Alternative lammps parse by @Leimeroth in https://github.com/pyiron/pyiron_atomistics/pull/658
    • Properly parse energy states and occupations by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/832

    New Contributors

    • @prince-mathews made their first contribution in https://github.com/pyiron/pyiron_atomistics/pull/853

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.59...pyiron_atomistics-0.2.60

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.59(Oct 25, 2022)

    What's Changed

    • sphinx warnings whenever the server queue is allocated are removed by @ahmedabdelkawy in https://github.com/pyiron/pyiron_atomistics/pull/809
    • Trajectory: ensure remapped_indices is always an array by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/791
    • Bump matplotlib from 3.6.0 to 3.6.1 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/804
    • Enable ScipyMinizer without gradients by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/814
    • Ipywidgets are only required when building notebooks by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/819
    • Bump mp-api from 0.27.3 to 0.29.1 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/822
    • Update pyscal update to 2.10.18 by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/827
    • Add warning that Sphinx.calc_minimize does not support pressure by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/815
    • Bump numpy from 1.23.3 to 1.23.4 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/825
    • direct push disagreed with black - vasp docstring by @ligerzero-ai in https://github.com/pyiron/pyiron_atomistics/pull/836
    • Bump pandas from 1.5.0 to 1.5.1 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/840
    • [minor] Replace start_job by ref_job in SerialMaster by @samwaseda in https://github.com/pyiron/pyiron_atomistics/pull/837
    • Bump pymatgen from 2022.9.21 to 2022.10.22 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/841
    • Bump mp-api from 0.29.1 to 0.29.3 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/842
    • Bump scipy from 1.9.1 to 1.9.3 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/839
    • Bump base by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/843

    New Contributors

    • @ahmedabdelkawy made their first contribution in https://github.com/pyiron/pyiron_atomistics/pull/809

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.58...pyiron_atomistics-0.2.59

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.58(Oct 11, 2022)

    What's Changed

    • remove calc references by @srmnitc in https://github.com/pyiron/pyiron_atomistics/pull/783
    • StructureStorage: Fix None check when self._neigh is not defined by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/776
    • ScipyMinimizer input: Return a default group_name by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/790
    • Be ASE compatible wrt spins by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/775
    • Allow to fix some axes in Murnaghan by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/636
    • Bump mendeleev from 0.10.0 to 0.11.0 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/794
    • [minor] update neighborhood search for permutation by @samwaseda in https://github.com/pyiron/pyiron_atomistics/pull/797
    • [minor] correction for the BFGS algorithm by @samwaseda in https://github.com/pyiron/pyiron_atomistics/pull/800
    • Selective dynamics in some directions of a VASP POSCAR in ASE Atoms is not supported (pymatgen Structure -> Atoms converter) pymatgen_to_pyiron(structure) by @ligerzero-ai in https://github.com/pyiron/pyiron_atomistics/pull/792
    • Bump pyiron-base from 0.5.24 to 0.5.25 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/807
    • Run unittest suite with integration (notebook) environment by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/711
    • Bump base by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/811

    New Contributors

    • @ligerzero-ai made their first contribution in https://github.com/pyiron/pyiron_atomistics/pull/792

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.57...pyiron_atomistics-0.2.58

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.57(Sep 27, 2022)

    What's Changed

    • Bump numpy from 1.23.2 to 1.23.3 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/753
    • Bump matplotlib from 3.5.3 to 3.6.0 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/759
    • Add a new structure factory for the MaterialsProject by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/757
    • Merge Master by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/770
    • Add support for ASE molecule by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/725
    • Fix off-by-one in space_group plot by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/765
    • Empty potential list is OK by @liamhuber in https://github.com/pyiron/pyiron_atomistics/pull/767
    • LammpsInteractive: Catch error a structure is set that is not supported by potential by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/625
    • Redirect deprecation warning by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/762
    • Find potential by structure by @liamhuber in https://github.com/pyiron/pyiron_atomistics/pull/766
    • [minor] update spin evaluation by @samwaseda in https://github.com/pyiron/pyiron_atomistics/pull/772
    • Bump pandas from 1.4.4 to 1.5.0 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/778
    • Use rmtree to remove job_directory in sphinx tests by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/777
    • Bump pymatgen from 2022.9.8 to 2022.9.21 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/779
    • Bump base by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/781

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.56...pyiron_atomistics-0.2.57

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.56(Sep 13, 2022)

    What's Changed

    • StructurePlots: Correctly label crystal systems by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/749
    • Fix Input HDF serialization in ScipyOptimizer by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/722
    • Do not call deprecated remove_jobs_silently by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/755
    • Bump pymatgen from 2022.8.23 to 2022.9.8 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/754
    • Never let format_black fail by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/741

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.55...pyiron_atomistics-0.2.56

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.55(Sep 6, 2022)

    What's Changed

    • Replace a bunch of independent collections with a dataclass by @liamhuber in https://github.com/pyiron/pyiron_atomistics/pull/716
    • dont set initial temperature to 0 for NVE by @Leimeroth in https://github.com/pyiron/pyiron_atomistics/pull/721
    • Temporarily fix ipywidgets <8 to fix CI by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/729
    • Merge master by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/730
    • Bump spglib from 1.16.5 to 2.0.0 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/726
    • Calphy update by @srmnitc in https://github.com/pyiron/pyiron_atomistics/pull/724
    • Save selective_dynamics tag in StructureStorage by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/727
    • Lammps parse dump pandas by @Leimeroth in https://github.com/pyiron/pyiron_atomistics/pull/705
    • Raise error when incompatible structures are set on interactive jobs by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/731
    • Bump numpy from 1.23.1 to 1.23.2 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/720
    • Bump pymatgen from 2022.7.25 to 2022.8.23 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/732
    • Bump matplotlib from 3.5.2 to 3.5.3 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/719
    • Bump scipy from 1.9.0 to 1.9.1 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/733
    • Revert "Raise error when incompatible structures are set on interactive jobs" by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/736
    • Reintroduce Raise error when incompatible structures are set on interactive jobs by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/737
    • Short cut ChemicalElement comparison if same object by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/740
    • Atomsk: Add whitespace around orient if present by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/739
    • Use caches for environments; coverage from unittests; add docs test by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/738
    • Avoid excessive memory allocation when repeating SparseList by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/742
    • Bump pandas from 1.4.3 to 1.4.4 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/745
    • Bump spglib from 2.0.0 to 2.0.1 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/746
    • Bump base by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/747

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.54...pyiron_atomistics-0.2.55

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.54(Aug 16, 2022)

    What's Changed

    • Remove pointless try/except and pytables dep by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/715
    • Remove unused deps by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/714
    • Move some of the structure plotting functions from contrib by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/710
    • Add Moruzzi Paper to Murnaghan class by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/717
    • Vasp: Add functions to parse the resource usage by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/707
    • VASP Outcar: Get energy components by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/557
    • Bump base by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/723

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.53...pyiron_atomistics-0.2.54

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.53(Aug 9, 2022)

    What's Changed

    • Bump scikit-learn from 1.1.1 to 1.1.2 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/704
    • Deprecate structure creation methods directly on Project by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/650
    • remove deprecated arguments of rewrite_hdf5 by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/709
    • Update to pyiron_base-0.5.21 by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/712

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.52...pyiron_atomistics-0.2.53

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.52(Aug 4, 2022)

    What's Changed

    • Calphy update by @srmnitc in https://github.com/pyiron/pyiron_atomistics/pull/677
    • Import all pyiron_base dependencies directly from the package by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/687
    • Do not reinitialize VaspPotentialFile all the time by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/685
    • Lammps velocitiy handling by @Leimeroth in https://github.com/pyiron/pyiron_atomistics/pull/661
    • Bump pymatgen from 2022.7.8 to 2022.7.25 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/688
    • Bump scipy from 1.8.1 to 1.9.0 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/694
    • calphy update by @srmnitc in https://github.com/pyiron/pyiron_atomistics/pull/697
    • Update to pyiron_base-0.5.20 by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/699
    • Add StructureContainer.add_structure by @pmrv in https://github.com/pyiron/pyiron_atomistics/pull/701

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.51...pyiron_atomistics-0.2.52

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.51(Jul 19, 2022)

    What's Changed

    • Bump mendeleev from 0.9.0 to 0.10.0 by @dependabot in https://github.com/pyiron/pyiron_atomistics/pull/684
    • Make structure_to_lammps() a private function by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/678
    • np.matrix.trace() returns float by @jan-janssen in https://github.com/pyiron/pyiron_atomistics/pull/674
    • Update to pyiron_base-0.5.18 by @niklassiemer in https://github.com/pyiron/pyiron_atomistics/pull/686

    Full Changelog: https://github.com/pyiron/pyiron_atomistics/compare/pyiron_atomistics-0.2.50...pyiron_atomistics-0.2.51

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.50(Jul 12, 2022)

  • pyiron_atomistics-0.2.49(Jul 5, 2022)

  • pyiron_atomistics-0.2.48(Jun 21, 2022)

  • pyiron_atomistics-0.2.47(May 26, 2022)

  • pyiron_atomistics-0.2.45(Apr 27, 2022)

  • pyiron_atomistics-0.2.44(Apr 19, 2022)

  • pyiron_atomistics-0.2.43(Apr 12, 2022)

  • pyiron_atomistics-0.2.42(Apr 5, 2022)

  • pyiron_atomistics-0.2.41(Mar 30, 2022)

  • pyiron_atomistics-0.2.40(Mar 8, 2022)

  • pyiron_atomistics-0.2.39(Mar 1, 2022)

    • Add save in ElasticTensor (#551)
    • Raising errors when restart files don't exist (#422)
    • Save more input variables in calc_md (#547)
    • Support cube files without atoms (#526)
    • Dependency updates: #555
    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.38(Feb 22, 2022)

  • pyiron_atomistics-0.2.37(Feb 8, 2022)

  • pyiron_atomistics-0.2.36(Feb 3, 2022)

    Update Readthedocs (#519) Selected animation (#513) Spx refactor (#505) Make codebase black (#507 and #517) Dependency updates: #494, #515, #516, #510, #503, #509, #520

    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.35(Jan 18, 2022)

  • pyiron_atomistics-0.2.34(Jan 12, 2022)

    Since pyiron_atomistics-0.2.29 stresses are by default calculated and stored for VASP calculations. However, the stored values were stored in an undocumented order and had the wrong sign. #497 provides a fix by storing the stress as an unambiguous matrix.

    • Update to pyiron_base-0.5.0 and add changelog (#501)
    • Save VASP stresses as matrix (#497)
    • Drop python3.7 support (#500)
    • Add cell_only to Vasp.calc_minimize (#498)
    • Use current structure instead of output to update previous structure (#483)
    • give possibility of setting log_file in LAMMPS (#488)
    • Replace Random Atomistics by Lennard Jones in testing (#478)
    • Dependency updates: #485, #496, #493, #489
    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.33(Dec 14, 2021)

    • Some test modernization (#425)
    • Decrease convergence goal (#479)
    • revert error (#474)
    • Write POSCAR in direct coordinate when selective dynamics is on (#448)
    • Strain (#465)
    • Tessellation neighbors (#413)
    • add error message in qha (#466)
    • add assertion test to symmetry permutation (#463)
    • Refactor symmetrize_vectors (#462)
    • Add callback function for LAMMPS (#458)
    • Use numpy.all in NeighborsTrajectory (#461)
    • dependency updates: #472, #471, #469, #470, #480
    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.32(Dec 7, 2021)

    • More structures (#259)
    • Add proper smearing for VASP (#454)
    • Try Python 3.10 (#450)
    • Remove unused properties in NeighborsTrajectory (#457)
    • Do not polute resource_path (#453)
    • dependencies: #459
    Source code(tar.gz)
    Source code(zip)
  • pyiron_atomistics-0.2.31(Dec 1, 2021)

    • Make NeighborTrajectory simpler (#445)
    • Use state instead of Settings (#424)
    • use unwrapped_positions in displacements (#451)
    • Store shells in Neighbors Trajectory (#444)
    • replace full output info in str by chemical formula (#439)
    • Fix Lammps h5md parser (#446)
    • Use FlattenedStorage in NeighborsTrajectory (#387)
    • Clear up TypeError in StructureContainer.append (#441)
    • Add clear error when calling animate_structure on empty job (#442)
    • add get_primitive_cell from spglib (#433)
    • dependencies: #449, #432, #437, #430, #456
    • GitHub infrastructure: #438
    Source code(tar.gz)
    Source code(zip)
Owner
pyiron
pyiron - an integrated development environment (IDE) for materials science.
pyiron
Blender add-on for baking your scene to textures

Bake Scene This add-on bakes your scene to textures. This is useful in many situations: Creating trim sheets Creating decals Creating hair cards Creat

5 Sep 20, 2022
An echo kernel for JupyterLite

jupyterlite-echo-kernel An echo kernel for JupyterLite. Requirements JupyterLite = 0.1.0a10 Install To install the extension, execute: pip install ju

JupyterLite 7 Dec 07, 2022
VSCode Development Container Template

VSCode Development Container Template This template enables you to use a full-fledged containerized development environment for your machine learning

Paige Bailey 10 Oct 10, 2022
A comfy custom IDE where you can feel right at home

reZIDE a comfy custom IDE where you can feel right at home 🏡 Use simple, declarative configuration files to create complex IDEs with a single command

Zach 7 Jan 26, 2022
This is a backend for VCode Editor for saving & retriving data.

This is a backend for VCode Editor for saving & retriving data through the API.

Tejas Magade 1 Nov 22, 2021
Jarvide - A powerful AI mixed with a powerful IDE.

Jarvide About Jarvide Welcome to Jarvide. A powerful AI mixed with a powerful ID

Caeden 23 Oct 28, 2022
pyiron - an integrated development environment (IDE) for computational materials science.

pyiron pyiron - an integrated development environment (IDE) for computational materials science. It combines several tools in a common platform: Atomi

pyiron 20 Dec 22, 2022
Automatically detect obfuscated code and other state machines

Scripts to automatically detect obfuscated code and state machines in binaries.

Aaron 110 Dec 04, 2022
Kite IntelliJ plugin

Handbook Supported platforms The Kite plugin supports the following environments: PyCharm Community PyCharm Professional IntelliJ Community with the P

Kite 57 Dec 23, 2022
💻 Open recent VS Code folders and files using Ulauncher

ulauncher-vscode-recent 💻 Open recent VS Code folders and files using Ulauncher. Quickly open recently-opened VS Code project directories and files.

Mihir Chaturvedi 14 Nov 24, 2022
Integrate clang-format with Sublime Text

Sublime Text Clang Format Plugin This is a minimal plugin integrating clang-format with Sublime Text, with emphasis on the word minimal. It is not rea

Jon Palmisciano 1 Dec 17, 2021
A Sublime Text package that allows a user to view all the available core/plugin commands for Sublime Text and Sublime Merge, along with their documentation/source.

CommandsBrowser A Sublime Text package that allows a user to view all the available core/plugin commands for Sublime Text and Sublime Merge, along wit

Sublime Instincts 26 Nov 15, 2022
Python 3 patcher for Sublime Text v4107-4114 Windows x64

sublime-text-4-patcher Python 3 patcher for Sublime Text v4107-4114 Windows x64 Credits for signatures and patching logic goes to https://github.com/l

187 Dec 27, 2022
notebookJS: seamless JavaScript integration in Python Notebooks

notebookJS enables the execution of custom JavaScript code in Python Notebooks (Jupyter Notebook and Google Colab). This Python library can be useful for implementing and reusing interactive Data Vis

jorgehpo 146 Dec 07, 2022
Wasm powered Jupyter running in the browser 💡

JupyterLite JupyterLite is a JupyterLab distribution that runs entirely in the browser built from the ground-up using JupyterLab components and extens

JupyterLite 3k Jan 04, 2023
CTO (Call Tree Overviewer) is an IDA plugin for creating a simple and efficiant function call tree graph

CTO (Call Tree Overviewer) CTO (Call Tree Overviewer) is an IDA plugin for creating a simple and efficiant function call tree graph. It can also summa

Hiroshi Suzuki 257 Dec 24, 2022
Mu - A Simple Python Code Editor

A small, simple editor for beginner Python programmers. Written in Python and Qt5.

Mu 1.2k Jan 03, 2023
VSCode extension to sort and refactor python imports using reorder-python-imports.

reorder-python-imports VSCode extension to sort and refactor python imports using reorder-python-imports. Unlike other import organizers, reorder-pyth

Ryan Butler 3 Aug 26, 2022
A GitHub Action hosted Python IDE!

What is this ? This is an IDE running on GitHub Actions which can help in..... Running small snippets. Running codes whenever PC is not available and

Jainam Oswal 21 Nov 09, 2022
Joy is a tiny creative coding library in Python.

Joy Joy is a tiny creative coding library in Python. Installation The easiest way to install it is download joy.py and place it in your directory. The

FOSS United Foundation 181 Dec 04, 2022