Skip to content

Commit e8a7424

Browse files
authored
Merge pull request #115 from OpenSEMBA/dev
Updates dev with tagnumber changes in main
2 parents 10b70fd + 64821f8 commit e8a7424

File tree

17 files changed

+268
-205
lines changed

17 files changed

+268
-205
lines changed

.devcontainer/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
FROM intel/oneapi-hpckit

.devcontainer/devcontainer.json

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2+
// README at: https://github.com/devcontainers/templates/tree/main/src/cpp
3+
{
4+
"name": "OpenSEMBA dev. framework",
5+
"build": {
6+
"dockerfile": "Dockerfile"
7+
},
8+
"features": {
9+
"ghcr.io/msclock/features/vcpkg:2": {},
10+
"ghcr.io/devcontainers/features/python:1": {}
11+
},
12+
13+
// Features to add to the dev container. More info: https://containers.dev/features.
14+
// "features": {},
15+
16+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
17+
// "forwardPorts": [],
18+
19+
// Use 'postCreateCommand' to run commands after the container is created.
20+
"postStartCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
21+
22+
// Configure tool-specific properties.
23+
"customizations": {
24+
"codespaces": {
25+
"repositories": {
26+
"lmdiazangulo/json-fortran": { "permissions": "read-all" },
27+
"opensemba/fhash": { "permissions": "read-all" },
28+
"reference-lapack/lapack": { "permissions": "read-all" },
29+
"opensemba/ngtest": {"permissions": "read-all" },
30+
"google/googletest": { "permissions": "read-all" }
31+
}
32+
},
33+
"vscode": {
34+
"extensions": [
35+
"ms-toolsai.jupyter",
36+
"fortran-lang.linter-gfortran",
37+
"ms-vscode.cmake-tools",
38+
"ms-python.autopep8",
39+
"matepek.vscode-catch2-test-adapter"
40+
]
41+
}
42+
}
43+
44+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
45+
// "remoteUser": "root"
46+
}

.devcontainer/notes.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
```
3+
git submodule init
4+
git submodule --recursive
5+
```
6+
7+
Install python packages
8+
```
9+
python3 -m venv ~/py_envs
10+
source ~/py_envs/bin/activate
11+
python3 -m pip install -r requirements.txt
12+
```

.github/workflows/windows.yml

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,20 @@ concurrency:
1414
jobs:
1515

1616
builds-and-tests:
17-
runs-on: windows-latest
17+
1818
strategy:
1919
matrix:
20+
os: [windows-latest]
2021
compiler: [ {name: 'intel', version: '2024.0'} ]
2122
build-type: ["Debug", "Release"]
2223
mpi: ["No"]
2324
mtln: ["Yes"]
2425
hdf: ["Yes"]
2526

26-
include:
27-
- compiler: {name: 'intel', version: '2024.0'}
28-
build-type: "Release"
29-
mpi: "No"
30-
mtln: "No"
31-
hdf: "Yes"
32-
3327
fail-fast: false
28+
runs-on: ${{matrix.os}}
3429

35-
name: ${{matrix.compiler.name}} / ${{matrix.build-type}}-mpi(${{matrix.mpi}})-mtln(${{matrix.mtln}})-hdf(${{matrix.hdf}})
30+
name: ${{matrix.os}} / ${{matrix.compiler.name}} / ${{matrix.build-type}}-mpi(${{matrix.mpi}})-mtln(${{matrix.mtln}})-hdf(${{matrix.hdf}})
3631

3732
steps:
3833

.gitmodules

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
[submodule "external/json-fortran"]
22
path = external/json-fortran
3-
url = git@github.com:lmdiazangulo/json-fortran.git
3+
url = https://github.com/lmdiazangulo/json-fortran.git
44
ignore = dirty
55

66
[submodule "external/fhash"]
77
path = external/fhash
8-
url = git@github.com:opensemba/fhash.git
8+
url = https://github.com/OpenSEMBA/fhash.git
99
ignore = dirty
1010

1111
[submodule "external/lapack"]
1212
path = external/lapack
13-
url = git@github.com:Reference-LAPACK/lapack.git
13+
url = https://github.com/Reference-LAPACK/lapack.git
1414
ignore = dirty
1515

1616
[submodule "external/ngspice"]
1717
path = external/ngspice
18-
url = git@github.com:opensemba/ngspice
18+
url = https://github.com/OpenSEMBA/ngspice.git
1919
ignore = dirty
2020

2121
[submodule "external/googletest"]
2222
path = external/googletest
23-
url = git@github.com:google/googletest.git
23+
url = https://github.com/google/googletest.git

src_main_pub/observation.F90

Lines changed: 125 additions & 88 deletions
Large diffs are not rendered by default.

src_main_pub/timestepping.F90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1746,7 +1746,7 @@ subroutine launch_simulation(sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sg
17461746
!Update observation matrices !MUST GO AFTER THE MPI EXCHANGING INFO, SINCE Bloque CURRENTS NEED UPDATED INFO
17471747
IF (Thereare%Observation) then
17481748
!se le pasan los incrementos autenticos (bug que podia aparecer en NF2FF y Bloque currents 17/10/12)
1749-
call UpdateObservation(sgg,sggMiEx,sggMiEy,sggMiEz,sggMiHx,sggMiHy,sggMiHz,sggMtag, n,ini_save, Ex, Ey, Ez, Hx, Hy, Hz, dxe, dye, dze, dxh, dyh, dzh,wiresflavor,SINPML_FULLSIZE,wirecrank, &
1749+
call UpdateObservation(sgg,sggMiEx,sggMiEy,sggMiEz,sggMiHx,sggMiHy,sggMiHz,sggMtag,tag_numbers, n,ini_save, Ex, Ey, Ez, Hx, Hy, Hz, dxe, dye, dze, dxh, dyh, dzh,wiresflavor,SINPML_FULLSIZE,wirecrank, &
17501750
Exvac, Eyvac, Ezvac, Hxvac, Hyvac, Hzvac,Excor, Eycor, Ezcor, Hxcor, Hycor, Hzcor,planewavecorr,noconformalmapvtk,b)
17511751

17521752
if (n>=ini_save+BuffObse) then

src_pyWrapper/pyWrapper.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,34 +38,34 @@ def __init__(self, probe_filename):
3838

3939
tag = self._getTagFromFilename(self.filename)
4040
if tag not in Probe.MOVIE_TAGS:
41-
self.df = pd.read_csv(self.filename, sep='\\s+')
41+
self.data = pd.read_csv(self.filename, sep='\\s+')
4242

4343
position_str = self._getPositionStrFromFilename(self.filename)
4444
if tag in Probe.CURRENT_PROBE_TAGS:
4545
self.type = 'wire'
4646
self.cell = self._positionStrToCell(position_str)
4747
self.segment = int(position_str.split('_s')[1])
4848
if self.domainType == 'time':
49-
self.df = self.df.rename(columns={
49+
self.data = self.data.rename(columns={
5050
't': 'time',
51-
self.df.columns[1]: 'current'
51+
self.data.columns[1]: 'current'
5252
})
5353
elif self.domainType == 'frequency':
54-
self.df = self.df.rename(columns={
55-
self.df.columns[0]: 'frequency',
56-
self.df.columns[1]: 'magnitude',
57-
self.df.columns[2]: 'phase'
54+
self.data = self.data.rename(columns={
55+
self.data.columns[0]: 'frequency',
56+
self.data.columns[1]: 'magnitude',
57+
self.data.columns[2]: 'phase'
5858
})
5959
elif tag in Probe.POINT_PROBE_TAGS:
6060
self.type = 'point'
6161
self.cell = self._positionStrToCell(position_str)
6262
self.field = tag[1]
6363
self.direction = tag[2]
6464
if self.domainType == 'time':
65-
self.df = self.df.rename(columns={
65+
self.data = self.data.rename(columns={
6666
't': 'time',
67-
self.df.columns[1]: 'field',
68-
self.df.columns[2]: 'incident'
67+
self.data.columns[1]: 'field',
68+
self.data.columns[2]: 'incident'
6969
})
7070
elif tag in Probe.FAR_FIELD_TAG:
7171
self.type = 'farField'
@@ -81,11 +81,10 @@ def __init__(self, probe_filename):
8181
self.type = 'mtln'
8282
self.cell = self._positionStrToCell(position_str)
8383
else:
84-
raise ValueError(
85-
"Unable to determine probe name or type for a probe with name:" + basename)
84+
raise ValueError("Unable to determine probe type")
8685

8786
def __getitem__(self, key):
88-
return self.df[key]
87+
return self.data[key]
8988

9089
@staticmethod
9190
def _getCaseNameFromFilename(fn):
@@ -224,7 +223,9 @@ def run(self):
224223
case_name = self.getCaseName() + ".json"
225224
self.output = subprocess.run(
226225
[self.path_to_exe, "-i", case_name]+self.flags)
226+
227227
self._hasRun = True
228+
assert self.hasFinishedSuccessfully()
228229

229230
def hasFinishedSuccessfully(self):
230231
if self._hasRun and (self.output.returncode == 0):

test/pyWrapper/test_full_system.py

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ def test_shieldedPair(tmp_path):
1111
flags=['-mtlnwires'],
1212
run_in_folder=tmp_path)
1313
solver.run()
14-
assert solver.hasFinishedSuccessfully() == True
1514

1615
probe_files = ['shieldedPair.fdtd_wire_start_bundle_line_0_V_75_74_74.dat',
1716
'shieldedPair.fdtd_wire_start_bundle_line_0_I_75_74_74.dat',
@@ -26,11 +25,11 @@ def test_shieldedPair(tmp_path):
2625

2726
for i in [2, 3]:
2827
p_solved = Probe(probe_files[i])
29-
assert np.allclose(p_expected[i].df.to_numpy()[:, 0:3], p_solved.df.to_numpy()[
28+
assert np.allclose(p_expected[i].data.to_numpy()[:, 0:3], p_solved.data.to_numpy()[
3029
:, 0:3], rtol=5e-2, atol=0.2)
3130
for i in [0, 1, 4, 5]:
3231
p_solved = Probe(probe_files[i])
33-
assert np.allclose(p_expected[i].df.to_numpy()[:, 0:4], p_solved.df.to_numpy()[
32+
assert np.allclose(p_expected[i].data.to_numpy()[:, 0:4], p_solved.data.to_numpy()[
3433
:, 0:4], rtol=5e-2, atol=0.2)
3534

3635

@@ -45,7 +44,6 @@ def test_coated_antenna(tmp_path):
4544
flags=['-mtlnwires'],
4645
run_in_folder=tmp_path)
4746
solver.run()
48-
assert solver.hasFinishedSuccessfully() == True
4947

5048
probe_current = solver.getSolvedProbeFilenames("mid_point_Wz")[0]
5149
probe_files = [probe_current]
@@ -55,16 +53,16 @@ def test_coated_antenna(tmp_path):
5553

5654
p_solved = Probe(probe_files[0])
5755
assert np.allclose(
58-
p_expected.df.to_numpy()[:, 0],
59-
p_solved.df.to_numpy()[:, 0],
56+
p_expected.data.to_numpy()[:, 0],
57+
p_solved.data.to_numpy()[:, 0],
6058
rtol=0.0, atol=10e-8)
6159
assert np.allclose(
62-
p_expected.df.to_numpy()[:, 1],
63-
p_solved.df.to_numpy()[:, 1],
60+
p_expected.data.to_numpy()[:, 1],
61+
p_solved.data.to_numpy()[:, 1],
6462
rtol=0.0, atol=10e-8)
6563
assert np.allclose(
66-
p_expected.df.to_numpy()[:, 2],
67-
p_solved.df.to_numpy()[:, 2],
64+
p_expected.data.to_numpy()[:, 2],
65+
p_solved.data.to_numpy()[:, 2],
6866
rtol=0.0, atol=10e-6)
6967

7068

@@ -75,7 +73,6 @@ def test_holland(tmp_path):
7573
run_in_folder=tmp_path)
7674

7775
solver.run()
78-
assert solver.hasFinishedSuccessfully() == True
7976

8077
probe_current = solver.getSolvedProbeFilenames("mid_point_Wz")[0]
8178
probe_files = [probe_current]
@@ -85,8 +82,8 @@ def test_holland(tmp_path):
8582

8683
p_solved = Probe(probe_files[0])
8784
assert np.allclose(
88-
p_expected.df.to_numpy()[:, 0:3],
89-
p_solved.df.to_numpy()[:, 0:3],
85+
p_expected.data.to_numpy()[:, 0:3],
86+
p_solved.data.to_numpy()[:, 0:3],
9087
rtol=1e-5, atol=1e-6)
9188

9289

@@ -98,7 +95,6 @@ def test_holland_mtln(tmp_path):
9895
flags=['-mtlnwires'], run_in_folder=tmp_path)
9996

10097
solver.run()
101-
assert solver.hasFinishedSuccessfully() == True
10298

10399
probe_current = solver.getSolvedProbeFilenames("mid_point_Wz")[0]
104100
probe_files = [probe_current]
@@ -108,8 +104,8 @@ def test_holland_mtln(tmp_path):
108104

109105
p_solved = Probe(probe_files[0])
110106
assert np.allclose(
111-
p_expected.df.to_numpy()[:, 0:3],
112-
p_solved.df.to_numpy()[:, 0:3],
107+
p_expected.data.to_numpy()[:, 0:3],
108+
p_solved.data.to_numpy()[:, 0:3],
113109
rtol=1e-5, atol=1e-6)
114110

115111

@@ -118,7 +114,6 @@ def test_towelHanger(tmp_path):
118114
solver = FDTD(input_filename=fn, path_to_exe=SEMBA_EXE,
119115
run_in_folder=tmp_path)
120116
solver.run()
121-
assert solver.hasFinishedSuccessfully() == True
122117

123118
probe_files = [solver.getSolvedProbeFilenames("wire_start")[0],
124119
solver.getSolvedProbeFilenames("wire_mid")[0],
@@ -131,7 +126,7 @@ def test_towelHanger(tmp_path):
131126

132127
for i in range(3):
133128
p_solved = Probe(probe_files[i])
134-
assert np.allclose(p_expected[i].df.to_numpy()[:, 0:3], p_solved.df.to_numpy()[
129+
assert np.allclose(p_expected[i].data.to_numpy()[:, 0:3], p_solved.data.to_numpy()[
135130
:, 0:3], rtol=5e-2, atol=5e-2)
136131

137132

@@ -146,18 +141,15 @@ def test_sphere(tmp_path):
146141
solver['probes'][0]['domain']['finalFrequency'] = 1e9
147142

148143
solver.run()
149-
assert solver.hasFinishedSuccessfully()
150144

151145
# semba-fdtd seems to always use the name Far for "far field" probes.
152146
far_field_probe_files = solver.getSolvedProbeFilenames("Far")
153-
assert solver.hasFinishedSuccessfully() == True
154147
assert len(far_field_probe_files) == 1
155148
p = Probe(far_field_probe_files[0])
156149
assert p.type == 'farField'
157150

158151
electric_field_movie_files = solver.getSolvedProbeFilenames(
159152
"electric_field_movie")
160-
assert solver.hasFinishedSuccessfully() == True
161153
assert len(electric_field_movie_files) == 3
162154
p = Probe(electric_field_movie_files[0])
163155
assert p.type == 'movie'
@@ -169,7 +161,6 @@ def test_movie_in_planewave_in_box(tmp_path):
169161
fn = CASES_FOLDER + 'planewave/pw-in-box-with-movie.fdtd.json'
170162
solver = FDTD(fn, path_to_exe=SEMBA_EXE, run_in_folder=tmp_path)
171163
solver.run()
172-
assert solver.hasFinishedSuccessfully()
173164

174165
h5file = solver.getSolvedProbeFilenames("electric_field_movie")[2]
175166
with h5py.File(h5file, "r") as f:
@@ -187,50 +178,47 @@ def test_planewave_in_box(tmp_path):
187178
solver = FDTD(fn, path_to_exe=SEMBA_EXE, run_in_folder=tmp_path)
188179

189180
solver.run()
190-
assert solver.hasFinishedSuccessfully()
191181

192182
before = Probe(solver.getSolvedProbeFilenames("before")[0])
193183
inbox = Probe(solver.getSolvedProbeFilenames("inbox")[0])
194184
after = Probe(solver.getSolvedProbeFilenames("after")[0])
195185

196-
np.allclose(inbox.df['field'], inbox.df['incident'])
197-
zeros = np.zeros_like(before.df['field'])
198-
np.allclose(before.df['field'], zeros)
199-
np.allclose(after.df['field'], zeros)
186+
np.allclose(inbox.data['field'], inbox.data['incident'])
187+
zeros = np.zeros_like(before.data['field'])
188+
np.allclose(before.data['field'], zeros)
189+
np.allclose(after.data['field'], zeros)
200190

201191

202192
def test_planewave_with_periodic_boundaries(tmp_path):
203193
fn = CASES_FOLDER + 'planewave/pw-with-periodic.fdtd.json'
204194
solver = FDTD(fn, path_to_exe=SEMBA_EXE, run_in_folder=tmp_path)
205195

206196
solver.run()
207-
assert solver.hasFinishedSuccessfully()
208-
197+
209198
before = Probe(solver.getSolvedProbeFilenames("before")[0])
210199
inbox = Probe(solver.getSolvedProbeFilenames("inbox")[0])
211200
after = Probe(solver.getSolvedProbeFilenames("after")[0])
212201

213-
np.allclose(inbox.df['field'], inbox.df['incident'])
214-
zeros = np.zeros_like(before.df['field'])
215-
np.allclose(before.df['field'], zeros)
216-
np.allclose(after.df['field'], zeros)
202+
np.allclose(inbox.data['field'], inbox.data['incident'])
203+
zeros = np.zeros_like(before.data['field'])
204+
np.allclose(before.data['field'], zeros)
205+
np.allclose(after.data['field'], zeros)
217206

218207

219208
def test_sgbc_shielding_effectiveness(tmp_path):
220209
fn = CASES_FOLDER + 'sgbcShieldingEffectiveness/shieldingEffectiveness.fdtd.json'
221210
solver = FDTD(fn, path_to_exe=SEMBA_EXE, run_in_folder=tmp_path)
222211

223212
solver.run()
224-
assert solver.hasFinishedSuccessfully()
225213

226214
# FDTD results
227215
back = Probe(solver.getSolvedProbeFilenames("back")[0])
228216

229-
t = back.df['time']
217+
t = back.data['time']
230218
dt = t[1] - t[0]
231219
fq = fftfreq(len(t))/dt
232-
INC = fft(back.df['incident'])
233-
BACK = fft(back.df['field'])
220+
INC = fft(back.data['incident'])
221+
BACK = fft(back.data['field'])
234222
S21 = BACK/INC
235223

236224
fmin = 8e6

0 commit comments

Comments
 (0)