GithubHelp home page GithubHelp logo

ffmpeg not installed? about fdtd HOT 15 OPEN

flaport avatar flaport commented on June 27, 2024
ffmpeg not installed?

from fdtd.

Comments (15)

flaport avatar flaport commented on June 27, 2024

If you want to use ffmpeg to export a video, you need the ffmpeg executable (not the python library) in your path. You can download ffmpeg here.

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

Thanks, but it still doesn't work. I put ffmpeg.exe into the same folder as the Jupyter Notebook file with your example scripts, but I still get ffmpeg not installed?. Could it maybe be that your scripts change the cwd?

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

...indeed: For instance, your GRIN example script changes cwd to the subfolder \\fdtd_output\\fdtd_output_2022-7-15-17-22-58 (GRIN)\\fdtd_output\\fdtd_output_2022-7-15-17-28-17 (GRIN). How to remediate?

It certainly doesn't make sense to be forced to put a copy of ffmpeg to each and every output folder, especially since they are dynamically created and named on runtime. So at the present state, these scripts are impossible to function properly, at least the final video rendering step!

Also, one cannot simply change cwd to the script path since then your grid.generate_video() won't find the video frames to work on. This seems like a problem that needs to be solved on source code level.

PS.: You should re-open this issue until it is solved.

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

Yip, just checked. Adding os.chdir() in front of your animation code block and setting cwd to the notebook path breaks your grid.generate_video()

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

HELLO???

from fdtd.

flaport avatar flaport commented on June 27, 2024

Hi @kerstin921 , This is an open source project. We're all developing this in our free time. I am sorry for not replying within 24 hours. It seems you found a bug in the video exporting feature, and from what I can tell you're already half way there in understanding the problem and fixing it... So if it's not too much to ask, please fix it, create a PR and it will get accepted. This is how open source works.

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

Hi flaport,

thanks for this information. I was under the impression that this basically is Python's official FDTD package, which is why I was so confused about the existence of such bugs (meaning it should've been reported earlier as people simply cannot miss it running your example scripts).

What is a PR and how does it solve the issue?

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

Yeah...no.

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Input In [28], in <cell line: 9>()
      7 grid[:, 0:10, :] = fdtd.PML(name="pml_ylow")
      8 grid[:, -10:, :] = fdtd.PML(name="pml_yhigh")
----> 9 simfolder = grid.save_simulation("test")  # initializing environment to save simulation data
     10 print(simfolder)
     13 # Source

File C:\Program Files\Python38\lib\site-packages\fdtd\grid.py:433, in Grid.save_simulation(self, sim_name)
    431 # storing timestamp title for self.generate_video
    432 self.full_sim_name = full_sim_name
--> 433 makedirs(self.folder, exist_ok=True)
    434 return self.folder

File C:\Program Files\Python38\lib\os.py:223, in makedirs(name, mode, exist_ok)
    221         return
    222 try:
--> 223     mkdir(name, mode)
    224 except OSError:
    225     # Cannot rely on checking for EEXIST, since the operating system
    226     # could give priority to other errors like EACCES or EROFS
    227     if not exist_ok or not path.isdir(name):

FileNotFoundError: [WinError 206] The filename or extension is too long: 'C:\\Users\\Username\\Desktop\\coherence_visualization\\fdtd_output\\fdtd_output_2022-7-22-19-43-46 (test)\\fdtd_output\\fdtd_output_2022-7-22-19-46-1 (test)\\fdtd_output\\fdtd_output_2022-7-22-19-46-53 (test)\\fdtd_output\\fdtd_output_2022-7-23-18-39-49 (test)'

This package is nowhere near production-ready and already breaks at the very first steps - so I'm out. Not worth the trouble and time investment only to find more bugs along the road.

gprmax is the way to go.

from fdtd.

flaport avatar flaport commented on June 27, 2024

Thanks for the hint @kerstin921 , gprmax seems indeed pretty cool!

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

It is, they used gprmax to design the ground-penetrating radar of the Perseverance Mars mission

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

@flaport Just to illustrate how bad the problem is, consider this baby example (even much simpler than your examples):

wavelength = 1e-6

# Initialize FDTD grid
grid = fdtd.Grid(shape=(20*wavelength, 50*wavelength, 1), grid_spacing=wavelength/10)

# Initialize perfectly matched layer (PML) boundaries
grid[0:10, :, :] = fdtd.PML(name="pml_xlow")
grid[-10:, :, :] = fdtd.PML(name="pml_xhigh")
grid[:, 0:10, :] = fdtd.PML(name="pml_ylow")
grid[:, -10:, :] = fdtd.PML(name="pml_yhigh")

# Initialize source
grid[:, 10, 0] = fdtd.LineSource(period=wavelength/299792458, name="source")

# Initialize objects
grid[10:190, 50:100, :] = fdtd.AbsorbingObject(permittivity=2.5, conductivity=1e-6, name="absorbing_object")

# Run simulation
start_time = timeit.default_timer()

for i in range(100):
    grid.step()  # Run simulation one timestep at a time and animate
    if i % 5 == 0:
        grid.visualize(z=0, cmap='plasma', animate=True, index=i, save=False)
        plt.title(f"{i}")
        clear_output(wait=True)  # Only necessary in Jupyter notebooks

print(timeit.default_timer() - start_time)

The output:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Input In [51], in <cell line: 17>()
     13 grid[:, 10, 0] = fdtd.LineSource(period=wavelength/299792458, name="source")
     16 # Initialize objects
---> 17 grid[10:190, 50:100, :] = fdtd.AbsorbingObject(permittivity=2.5, conductivity=1e-6, name="absorbing_object")
     20 # Run simulation
     21 start_time = timeit.default_timer()

File C:\Program Files\Python38\lib\site-packages\fdtd\grid.py:365, in Grid.__setitem__(self, key, attr)
    362 else:
    363     raise KeyError("maximum number of indices for the grid is 3")
--> 365 attr._register_grid(
    366     grid=self,
    367     x=self._handle_single_key(x),
    368     y=self._handle_single_key(y),
    369     z=self._handle_single_key(z),
    370 )

File C:\Program Files\Python38\lib\site-packages\fdtd\objects.py:193, in AbsorbingObject._register_grid(self, grid, x, y, z)
    187     conductivity = conductivity[..., None]
    188 self.conductivity = bd.broadcast_to(
    189     conductivity, self.inverse_permittivity.shape
    190 )
    192 self.absorption_factor = (
--> 193     0.5
    194     * self.grid.courant_number
    195     * self.inverse_permittivity
    196     * self.conductivity
    197     * self.grid.grid_spacing
    198     * const.eta0
    199 )

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

And this perfectly illustrates the problem with Python: People putting hundreds of non-functional packages into the official PyPI repository, tricking users to waste endless hours into experimenting with packages that don't even pass the simplest test cases, then waving hands and saying "It's open-course!" and "Community!".

While in reality, they just want to have a GitHub repository to pad their CVs and couldn't care less about quality.

from fdtd.

flaport avatar flaport commented on June 27, 2024

Hi @kerstin921 ,

I am sorry you had a bad experience with this package. Of course having non-functional code in the library must be very frustrating for you.

I know the library has not been actively maintained recently and I have probably been accepting pull requests too easily in the past, which made parts of the code unstable (see for example #15, which introduced the video generation function).

That said, I will do a thorough review of the library in the near future (when I find the time) to find and remove bugs and to make sure it's back to a stable state.

Please do understand that I have a full time job which means I don't have the time to work on and maintain the projects like I used to. I am sorry this lead to lost time for you.

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

It's not 100% lost time (maybe 80% or so) as I'm still familiarizing and learning a few things while trying to get your package working. The problem is that the very basic examples seem not to be working. Usually, such problems are quickly resolved (since examples normally give a working demonstration) because else you'd bascially be dealing with a "cool", but non-functioning codebase published for everyone on the internet. And some of the files/many functions contain almost no documentation, so even for willing beta testers like me it quickly gets super frustrating to fix anything (and I'm not getting paid). Sorry to stress you out

from fdtd.

kerstin921 avatar kerstin921 commented on June 27, 2024

But maybe that's just me as I use to write code as if meant for kindergardeners (i.e. every little piece is documented), so I can basically just give it to a collegue and there will hardly ever come back questions

from fdtd.

herm60 avatar herm60 commented on June 27, 2024

png can be merged with ffmpeg using the following DOS commands after installation, but each file shall be parsed correctly :
(ex: file0001.png, file0002.png...file0500.png)

ffmpeg -framerate 10 -start_number 0 -i file%4d.png -c:v libx264 -pix_fmt yuv420p out.mp4

files by 10 steps

(ex: file0010.png, file0020.png...file5000.png)

ffmpeg -framerate 10 -start_number 0 -i file%4d.png -c:v libx264 -pix_fmt yuv420p out.mp4

example of storing files by single entries:

simfolder = grid.save_simulation("Emtest") # initializing environment to save simulation data
print(simfolder)

with open(os.path.join(simfolder, "grid.txt"), "w") as f:
f.write(str(grid))
wavelength = 3e8/grid.source.frequency
wavelengthUnits = wavelength/grid.grid_spacing
GD = np.array([grid.x, grid.y, None])

for i in range(500):
grid.step() # running simulation 1 timestep a time and animating
# saving frames during visualization with index 1
grid.visualize(z=0, animate=True, index=i, save=True, folder=simfolder)
plt.title(f"{i:3.0f}")

from fdtd.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.