Comments (15)
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.
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.
...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.
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.
HELLO???
from fdtd.
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.
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.
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.
Thanks for the hint @kerstin921 , gprmax seems indeed pretty cool!
from fdtd.
It is, they used gprmax
to design the ground-penetrating radar of the Perseverance Mars mission
from fdtd.
@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.
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.
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.
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.
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)
- Is fdtd suitable for antenna design? HOT 1
- How do I define a custom electromagnetic field profile as source, like the Import Source in the Lumerical FDTD?
- Hello! How to obtain the phase of electromagnetic field?
- `RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!` HOT 7
- Loading Spatial Distributions HOT 1
- Polarization for Linear Source
- Version on pypi doesn't have commit "don't use bd.float directly for type casting" and is erroring HOT 1
- The kernel appears to have died. It will restart automatically.
- Simulation of metals (complex refractive index) HOT 3
- development dependencies not downloading HOT 2
- fdtd.backend and fdtd.set_backend errors HOT 1
- Problem on running with fdtd.set_backend("torch") HOT 10
- Where to obtain Total field Array HOT 1
- ERROR: File "setup.py" not found. HOT 4
- outputing to VTK issue with interal grid structure
- Can this library use Riker wavelets? Or can I customize the waveform of the source?
- Feature Request: Importing CAD models (.stl, .fbx, etc.) HOT 1
- Pulsing field of simple point sources?
- What is the specific role of parameter a in the perfect matching layer HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fdtd.