前提・実現したいこと
python3.6を用いて数値計算を行い、その過程でループ途中のNumpy配列を保存したいと考えています。その際、np.loadtxtおよびsavetxtを使っているのですが、保存の際にエラーが出てしまいます。
発生している問題・エラーメッセージ
C:\Users\USER\python\FDTD\シン・ELECTROMAGNETIC SIMULATION USING THE FDTD(202201 10より)\レーザーのシミュレーション\テスト\増幅の周波数特性測定\ローレンツ媒質導 入>python fd2d_sub_500cell.py 0%| | 2/4000 [00:04<2:44:14, 2.46s/it] Traceback (most recent call last): File "fd2d_sub_500cell.py", line 82, in <module> sz2 = np.loadtxt(os.path.join(dir2,'sz_field_{0}.txt').format(before_time)) File "C:\Users\USER\AppData\Local\Programs\Python\Python36\lib\site-packages\n umpy\lib\npyio.py", line 961, in loadtxt fh = np.lib._datasource.open(fname, 'rt', encoding=encoding) File "C:\Users\USER\AppData\Local\Programs\Python\Python36\lib\site-packages\n umpy\lib\_datasource.py", line 195, in open return ds.open(path, mode, encoding=encoding, newline=newline) File "C:\Users\USER\AppData\Local\Programs\Python\Python36\lib\site-packages\n umpy\lib\_datasource.py", line 535, in open raise IOError("%s not found." % path) OSError: sz/sz_field_1.txt not found.
該当のソースコード
以下はソースコードです。
szの初期値は全要素が0の500x500のNumpy配列です。
python3.6
1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4""" 5fd2d 細々といじる用 6""" 7 8import os 9import numpy as np 10from math import pi, sin, cos, exp, sqrt 11from matplotlib import pyplot as plt 12from mpl_toolkits.mplot3d.axes3d import Axes3D, get_test_data 13from tqdm import tqdm 14 15import fd2d_init_value as fi 16 17# データ用のファイル作成 18os.mkdir('data') 19os.mkdir('sz') 20 21# ディレクトリ指定用 22dir1 = 'data/' 23dir2 = 'sz/' 24 25# 初期時間 26tau = 20 27 28# 周波数対強度のリスト 29amp = [] 30 31# 強度計算用の配列(実部と虚部) 32re_ez = [] 33im_ez = [] 34 35# 特定の点を入れておくためのリスト 36point_x = range(1, fi.nsteps + 1) 37point_y = [] 38 39# 補助項の定義 40sz = fi.sz 41sz2 = np.zeros((fi.ie, fi.je)) 42 43# 各パラメータの読み込み 44epsr = fi.epsr 45delta0 = fi.delta0 46f0 = fi.f0 47omega0 = fi.omega0 48eps1 = fi.eps1 49 50# 対数スケールの配列作成 51start = 10^6 52stop = 10^10 53freq_list = np.logspace(start,stop) 54 55# 補助項の係数の計算 56base = 1 + fi.dt * delta0 * omega0 57top1 = 2 - (fi.dt**2) * (omega0**2) 58top2 = 1 - (fi.dt * delta0 * omega0) 59top3 = (fi.dt**2) * (omega0**2) * eps1 60 61# Main FDTD Loop 62for time_step in tqdm( range(1, fi.nsteps + 1) ): 63 64 # Calculate the Dz field 65 for j in range(1, fi.je): 66 for i in range(1, fi.ie): 67 fi.dz[i, j] = fi.gi3[i] * fi.gj3[j] * fi.dz[i, j] + fi.gi2[i] * fi.gj2[j] * 0.5 * (fi.hy[i, j] - fi.hy[i - 1, j] - fi.hx[i, j] + fi.hx[i, j - 1]) 68 69 # Source1 70 if abs(time_step - tau*3) < tau*3: 71 gause_pulse = ( exp( - ( time_step - tau*3 ) **2 / tau ) ) 72 fi.dz[250][250] = gause_pulse 73 74 else: 75 continue 76 77 #補助項Sの2ステップ前の読み込み 78 if time_step < 3: 79 continue 80 else: 81 before_time = time_step - 2 82 sz2 = np.loadtxt(os.path.join(dir2,'sz_field_{0}.txt').format(before_time)) 83 84 # 補助項Sの計算 85 for i in range(fi.mir_y_bey, fi.mir_y_ove): 86 for j in range(fi.mir_x_sta, fi.mir_x_fin): 87 sz[i,j] = (sz[i,j] * top1 / base) - (sz2[i,j] * top2 / base) + (fi.ez[i,j] * top3 / base) 88 89 # Sの保存 90 np.savetxt(os.path.join(dir2,'sz_field_{0}.txt').format(time_step), sz) 91 92 # Calculate the Ez field 93 for j in range(0, fi.je): 94 for i in range(0, fi.ie): 95 fi.ez[i, j] = (fi.dz[i, j] - sz[i,j]) / epsr 96 97 # Calculate the Hx field 98 for j in range(0, fi.je - 1): 99 for i in range(0, fi.ie - 1): 100 curl_e = fi.ez[i, j] - fi.ez[i, j + 1] 101 fi.ihx[i, j] = fi.ihx[i, j] + curl_e 102 fi.hx[i, j] = fi.fj3[j] * fi.hx[i, j] + fi.fj2[j] * (0.5 * curl_e + fi.fil[i] * fi.ihx[i,j]) 103 104 # Calculate the Hy field 105 for j in range(0, fi.je - 1): 106 for i in range(0, fi.ie - 1): 107 curl_e = fi.ez[i, j] - fi.ez[i + 1, j] 108 fi.ihy[i, j] = fi.ihy[i, j] + curl_e 109 fi.hy[i, j] = fi.fi3[i] * fi.hy[i, j] - fi.fi2[i] * (0.5 * curl_e + fi.fjl[j] * fi.ihy[i,j]) 110 111 # 強度分布の計算 112 for i, freq in enumerate(freq_list): 113 arg = 2 * pi * freq * fi.dt * time_step 114 re_ez[i] = re_ez[i] + cos( arg ) * fi.ez[300][300] 115 im_ez[i] = im_ez[i] - sin( arg ) * fi.ez[300][300] 116 amp[i] = sqrt( (re_ez[i]) **2 + (im_ez[i]) **2 ) 117 118 point_y.append(fi.ez[fi.ie - 30, fi.je - 30]) 119 120 if time_step % 100 ==0: 121 e_field = np.copy(fi.ez) 122 np.savetxt(os.path.join(dir1, 'e_result_{0}.txt'. format(time_step)), e_field) 123 e_center = np.copy(fi.ez[:,250]) 124 np.savetxt(os.path.join(dir1, 'e_center_{0}.txt'. format(time_step)), e_center) 125 126 else : 127 continue 128 129f = open('a_point_list(raw).txt', 'w') 130for x in point_y: 131 f.write(str(x) + "\n") 132f.close() 133 134f = open('freq_vs_amp.txt', 'w') 135for x in amp: 136 f.write(str(x) + "\n") 137f.close() 138 139# 特定の点の変化を表すグラフの作成 140fig = plt.figure(figsize=(8, 8)) 141ax = fig.add_subplot(1,1,1) 142ax.plot(point_x, point_y) 143 144fig.tight_layout() 145plt.savefig("point_vary.png")
試したこと
savetxtと.formatの相性が悪いのかと思い、書き方をいくつか変更してみましたが動きませんでした。ディレクトリ指定の方法が間違っているのかとも思ったのですが、何度確認しても間違いが見つけられませんでした。
補足情報(FW/ツールのバージョンなど)
numpy 1.19.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/31 04:15
2022/01/31 08:16
2022/01/31 11:50