Skip to content

Commit f47ef42

Browse files
Merge pull request #249 from OpenSEMBA/dev
Merge dev into master
2 parents e27af6e + 965bbc7 commit f47ef42

File tree

13 files changed

+1294
-41
lines changed

13 files changed

+1294
-41
lines changed

.github/workflows/ubuntu.yml

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,15 @@ jobs:
4646
# mtln: "Yes"
4747
# hdf: "Yes"
4848
# double-precision: "No"
49-
50-
- os: ubuntu-latest
51-
compiler: {name: 'nvidia-hpc', version: '24.5'}
52-
build-type: "Release"
53-
mpi: "No"
54-
mtln: "No"
55-
hdf: "No"
56-
double-precision: "No"
49+
50+
# Disable by lack of space on github action
51+
# - os: ubuntu-latest
52+
# compiler: {name: 'nvidia-hpc', version: '24.5'}
53+
# build-type: "Release"
54+
# mpi: "No"
55+
# mtln: "No"
56+
# hdf: "No"
57+
# double-precision: "No"
5758

5859
- os: ubuntu-latest # This is the only test with double precision.
5960
compiler: {name: 'intel', version: '2025.1'}

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux")
6060
set(CMAKE_CXX_FLAGS_RELEASE "-Ofast")
6161
set(CMAKE_Fortran_FLAGS_RELEASE "-Ofast")
6262

63-
set(CMAKE_Fortran_FLAGS_DEBUG "-g -O0")
63+
set(CMAKE_Fortran_FLAGS_DEBUG "-g -O0 -fno-inline -fcheck=all -fbacktrace")
6464

6565
elseif(CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM")
6666
message(STATUS "Using IntelLLVM (ifx) flags")

src_json_parser/smbjson.F90

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,6 +1430,8 @@ function readBlockProbe(bp) result(res)
14301430
type(coords), dimension(:), allocatable :: cs
14311431
type(cell_region_t), dimension(:), allocatable :: cRs
14321432

1433+
character(len=1) :: direction
1434+
14331435
cRs = this%mesh%getCellRegions(this%getIntsAt(bp, J_ELEMENTIDS))
14341436
if (size(cRs) /= 1) then
14351437
call WarnErrReport("Bulk current probe must be defined by a single cell region.", .true.)
@@ -1447,6 +1449,15 @@ function readBlockProbe(bp) result(res)
14471449
res%k1 = cs(1)%zi
14481450
res%k2 = cs(1)%ze
14491451
res%nml = abs(cs(1)%Or)
1452+
if (res%nml == 0) then !DIR_NULL
1453+
direction = this%getStrAt(bp, J_DIR)
1454+
select case(trim(adjustl(direction)))
1455+
case(J_DIR_X); res%nml = 1 !DIR_X
1456+
case(J_DIR_Y); res%nml = 2 !DIR_Y
1457+
case(J_DIR_Z); res%nml = 3 !DIR_Z
1458+
case default; call WarnErrReport('Null direction detected for bulk probe. Check definition')
1459+
end select
1460+
end if
14501461

14511462
res%outputrequest = trim(adjustl(this%getStrAt(bp, J_NAME)))
14521463
call setDomain(res, this%getDomain(bp, J_PR_DOMAIN))
@@ -2722,6 +2733,7 @@ function buildNode(termination_list, label, index, id) result(res)
27222733
type(polyline_t) :: polyline
27232734
type(aux_node_t) :: res
27242735
integer :: cable_index
2736+
integer :: stat
27252737
call this%core%get_child(termination_list, index, termination)
27262738

27272739
res%node%termination%termination_type = readTerminationType(termination)
@@ -2735,17 +2747,18 @@ function buildNode(termination_list, label, index, id) result(res)
27352747
res%node%side = label
27362748
res%node%conductor_in_cable = index
27372749

2738-
call elemIdToCable%get(key(id), value=cable_index)
2750+
call elemIdToCable%get(key(id), value=cable_index, stat=stat)
2751+
if (stat == 0) then
27392752
res%node%belongs_to_cable => mtln_res%cables(cable_index)%ptr
27402753

27412754
polyline = this%mesh%getPolyline(id)
2742-
2743-
if (label == TERMINAL_NODE_SIDE_INI) then
2744-
res%cId = polyline%coordIds(1)
2745-
res%relPos = this%mesh%getCoordinate(polyline%coordIds(1))
2746-
else if (label == TERMINAL_NODE_SIDE_END) then
2747-
res%cId = polyline%coordIds(ubound(polyline%coordIds,1))
2748-
res%relPos = this%mesh%getCoordinate(polyline%coordIds(ubound(polyline%coordIds,1)))
2755+
if (label == TERMINAL_NODE_SIDE_INI) then
2756+
res%cId = polyline%coordIds(1)
2757+
res%relPos = this%mesh%getCoordinate(polyline%coordIds(1))
2758+
else if (label == TERMINAL_NODE_SIDE_END) then
2759+
res%cId = polyline%coordIds(ubound(polyline%coordIds,1))
2760+
res%relPos = this%mesh%getCoordinate(polyline%coordIds(ubound(polyline%coordIds,1)))
2761+
end if
27492762
end if
27502763
end function
27512764

@@ -3176,9 +3189,10 @@ function getPointerToParentCable(cables, id) result(res)
31763189
call elemIdToCable%check_key(key(id), mStat)
31773190
if (mStat /= 0) then
31783191
res => null()
3192+
else
3193+
call elemIdToCable%get(key(id), value=index)
3194+
res => cables(index)%ptr
31793195
end if
3180-
call elemIdToCable%get(key(id), value=index)
3181-
res => cables(index)%ptr
31823196
end function
31833197

31843198
function findConnectorWithId(conn_Id) result(res)
@@ -3480,29 +3494,54 @@ function buildSegments(j_cable, despl) result(res)
34803494
end do
34813495
end function
34823496

3497+
pure integer function clip(i, lo, hi)
3498+
integer, intent(in) :: i, lo, hi
3499+
clip = max(lo, min(i, hi))
3500+
end function clip
3501+
34833502
function getdualBoxYZ(segment, despl) result (res)
34843503
type(Desplazamiento), intent(in) :: despl
34853504
type(segment_t), intent(in) :: segment
34863505
type(box_2d_t) :: res
3487-
res%min = [-0.5*despl%desY(segment%y-1),-0.5*despl%desZ(segment%z-1)]
3488-
res%max = [ 0.5*despl%desY(segment%y), 0.5*despl%desZ(segment%z)]
3506+
integer :: y0, y1, z0, z1
3507+
3508+
y0 = clip(segment%y-1, 0, size(despl%desY)-1)
3509+
y1 = clip(segment%y, 0, size(despl%desY)-1)
3510+
z0 = clip(segment%z-1, 0, size(despl%desZ)-1)
3511+
z1 = clip(segment%z, 0, size(despl%desZ)-1)
3512+
3513+
res%min = [-0.5 * despl%desY(y0), -0.5 * despl%desZ(z0)]
3514+
res%max = [ 0.5 * despl%desY(y1), 0.5 * despl%desZ(z1)]
34893515
end function
34903516

34913517
function getdualBoxXY(segment, despl) result (res)
34923518
type(Desplazamiento), intent(in) :: despl
34933519
type(segment_t), intent(in) :: segment
34943520
type(box_2d_t) :: res
3495-
res%min = [-0.5*despl%desX(segment%x-1),-0.5*despl%desY(segment%y-1)]
3496-
res%max = [ 0.5*despl%desX(segment%x), 0.5*despl%desY(segment%y)]
3521+
integer :: x0, x1, y0, y1
3522+
3523+
x0 = clip(segment%x-1, 0, size(despl%desX)-1)
3524+
x1 = clip(segment%x, 0, size(despl%desX)-1)
3525+
y0 = clip(segment%y-1, 0, size(despl%desY)-1)
3526+
y1 = clip(segment%y, 0, size(despl%desY)-1)
3527+
3528+
res%min = [-0.5 * despl%desX(x0), -0.5 * despl%desY(y0)]
3529+
res%max = [ 0.5 * despl%desX(x1), 0.5 * despl%desY(y1)]
34973530
end function
34983531

34993532
function getdualBoxZX(segment, despl) result (res)
35003533
type(Desplazamiento), intent(in) :: despl
35013534
type(segment_t), intent(in) :: segment
35023535
type(box_2d_t) :: res
3503-
res%min = [-0.5*despl%desZ(segment%z-1),-0.5*despl%desX(segment%x-1)]
3504-
res%max = [ 0.5*despl%desZ(segment%z), 0.5*despl%desX(segment%x)]
3536+
integer :: z0, z1, x0, x1
3537+
3538+
z0 = clip(segment%z-1, 0, size(despl%desZ)-1)
3539+
z1 = clip(segment%z, 0, size(despl%desZ)-1)
3540+
x0 = clip(segment%x-1, 0, size(despl%desX)-1)
3541+
x1 = clip(segment%x, 0, size(despl%desX)-1)
35053542

3543+
res%min = [-0.5 * despl%desZ(z0), -0.5 * despl%desX(x0)]
3544+
res%max = [ 0.5 * despl%desZ(z1), 0.5 * despl%desX(x1)]
35063545
end function
35073546

35083547
function buildStepSize(segments, despl) result(res)

src_json_parser/smbjson_labels.F90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module smbjson_labels_mod
88
character (len=*), parameter :: J_TYPE = "type"
99
character (len=*), parameter :: J_ELEMENTIDS = "elementIds"
1010

11+
character (len=*), parameter :: J_DIR = "direction"
1112
character (len=*), parameter :: J_DIR_X = "x"
1213
character (len=*), parameter :: J_DIR_Y = "y"
1314
character (len=*), parameter :: J_DIR_Z = "z"

test/observation/observation_testingTools.F90

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ subroutine check_shape_real(arr, n_expected, test_err, name)
5959
integer, allocatable :: shp(:)
6060
character(len=:), allocatable :: nm
6161

62-
nm = merge(name, "array", present(name))
62+
if (present(name)) then
63+
nm = trim(adjustl(name))
64+
else
65+
nm = "array"
66+
end if
6367

6468
rank_arr = rank(arr)
6569
shp = shape(arr)
@@ -82,7 +86,11 @@ subroutine check_shape_complex(arr, n_expected, test_err, name)
8286
integer, allocatable :: shp(:)
8387
character(len=:), allocatable :: nm
8488

85-
nm = merge(name, "array", present(name))
89+
if (present(name)) then
90+
nm = trim(adjustl(name))
91+
else
92+
nm = "array"
93+
end if
8694

8795
rank_arr = rank(arr)
8896
shp = shape(arr)
@@ -105,7 +113,11 @@ subroutine check_size(arr, n_expected, test_err, name)
105113
integer :: siz
106114
character(len=:), allocatable :: nm
107115

108-
nm = merge(name, "array", present(name))
116+
if (present(name)) then
117+
nm = trim(adjustl(name))
118+
else
119+
nm = "array"
120+
end if
109121

110122
rank_arr = rank(arr)
111123
siz = size(arr)
@@ -200,7 +212,7 @@ function create_base_sgg() result(sgg)
200212
type(SGGFDTDINFO) :: sgg
201213

202214
sgg%NumMedia = 3
203-
allocate(sgg%Med(1:sgg%NumMedia))
215+
allocate(sgg%Med(0:sgg%NumMedia))
204216
sgg%Med = create_basic_media()
205217
sgg%NumberRequest = 1
206218
sgg%dt = 0.1_RKIND_tiempo

test/observation/test_observation_init.F90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ integer function test_init_time_movie_observation() bind(C) result(err)
2929
ThereAreWires = .false.
3030
ThereAreFarFields = .false.
3131

32-
initialtimestep = 0
32+
initialtimestep = 1
3333
lastexecutedtime = 0.0_RKIND_tiempo
3434

3535
SINPML_fullsize = create_limit_t(0,4,0,4,0,4,3,3,3)

test/observation/test_observation_update.F90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ integer function test_update_time_movie_observation() bind(C) result(err)
3131
ThereAreWires = .false.
3232
ThereAreFarFields = .false.
3333

34-
initialtimestep = 0
34+
initialtimestep = 1
3535
lastexecutedtime = 0.0_RKIND_tiempo
3636

3737
SINPML_fullsize = create_limit_t(0,4,0,4,0,4,3,3,3)

test/pyWrapper/test_full_system.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1024,4 +1024,35 @@ def test_negative_offset_in_x(tmp_path):
10241024

10251025
assert np.corrcoef(probeTotal['current'].to_numpy(), I_interp)[0, 1] > 0.999
10261026
assert np.corrcoef(probeL['current'].to_numpy(), I_interp)[0, 1] > 0.999
1027-
assert np.allclose(probeR['current'].to_numpy(), 0.0, atol=3e-3)
1027+
assert np.allclose(probeR['current'].to_numpy(), 0.0, atol=3e-3)
1028+
1029+
def test_bulk_current_outputs(tmp_path):
1030+
# This test uses bulk_probe_cases_over_nodal_source.fdtd from input_examples as input.
1031+
# Verifies all kind of bulk probes are recognised and setted properly by checking outputFile format.
1032+
fn = PROBES_INPUT_EXAMPLE + 'bulk_probe_cases_over_nodal_source.fdtd.json'
1033+
solver = FDTD(fn, path_to_exe=SEMBA_EXE, run_in_folder=tmp_path)
1034+
solver.run()
1035+
1036+
bulkXPlaneFiles = solver.getSolvedProbeFilenames("BulkXPlane")
1037+
bulkYPlaneFiles = solver.getSolvedProbeFilenames("BulkYPlane")
1038+
bulkZPlaneFiles = solver.getSolvedProbeFilenames("BulkZPlane")
1039+
bulkYPointFiles = solver.getSolvedProbeFilenames("BulkYPoint")
1040+
bulkZVolumeFiles = solver.getSolvedProbeFilenames("BulkZVolume")
1041+
1042+
assert len(bulkXPlaneFiles) == 1
1043+
assert len(bulkYPlaneFiles) == 1
1044+
assert len(bulkZPlaneFiles) == 1
1045+
assert len(bulkYPointFiles) == 1
1046+
assert len(bulkZVolumeFiles) == 10
1047+
1048+
probeBulkXPlane = Probe(bulkXPlaneFiles[0])
1049+
probeBulkYPlane = Probe(bulkYPlaneFiles[0])
1050+
probeBulkZPlane = Probe(bulkZPlaneFiles[0])
1051+
probeBulkYPoint = Probe(bulkYPointFiles[0])
1052+
probeBulkZVolume = Probe(bulkZVolumeFiles[0])
1053+
1054+
assert probeBulkXPlane.direction == 'x'
1055+
assert probeBulkYPlane.direction == 'y'
1056+
assert probeBulkZPlane.direction == 'z'
1057+
assert probeBulkYPoint.direction == 'y'
1058+
assert probeBulkZVolume.direction == 'z'

test/pyWrapper/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
OUTPUTS_FOLDER = os.path.join(TEST_DATA_FOLDER, 'outputs/')
4242
SPINIT_FOLDER = os.path.join(TEST_DATA_FOLDER, 'spinit/')
4343
GEOMETRIES_FOLDER = os.path.join(TEST_DATA_FOLDER, 'geometries/')
44+
PROBES_INPUT_EXAMPLE = os.path.join(TEST_DATA_FOLDER, 'input_examples/probes/')
4445

4546
def getCase(case):
4647
return json.load(open(CASES_FOLDER + case + '.fdtd.json'))

test/smbjson/test_read_mtln.F90

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ function expectedProblemDescription() result (expected)
129129
! cable 1 - wire
130130
allocate(unshielded_multiwire_t :: expected%mtln%cables(1)%ptr)
131131
ptr => expected%mtln%cables(1)%ptr
132-
call initializeCablePULParameters(ptr)
132+
call initializeCablePULParameters(ptr, n=1)
133133
select type(ptr)
134134
type is (unshielded_multiwire_t)
135135
ptr%name = "line_0_0"
@@ -156,7 +156,7 @@ function expectedProblemDescription() result (expected)
156156
! cable 2 - shieldedMultiwire
157157
allocate(shielded_multiwire_t :: expected%mtln%cables(2)%ptr)
158158
ptr => expected%mtln%cables(2)%ptr
159-
call initializeCablePULParameters(ptr)
159+
call initializeCablePULParameters(ptr, n=1)
160160
select type(ptr)
161161
type is (shielded_multiwire_t)
162162
ptr%name = "line_1_0"
@@ -244,7 +244,7 @@ function expectedProblemDescription() result (expected)
244244
! cable 4 - wire
245245
allocate(unshielded_multiwire_t :: expected%mtln%cables(4)%ptr)
246246
ptr => expected%mtln%cables(4)%ptr
247-
call initializeCablePULParameters(ptr)
247+
call initializeCablePULParameters(ptr, n=1)
248248
select type(ptr)
249249
type is (unshielded_multiwire_t)
250250
ptr%name = "line_0_1"
@@ -272,7 +272,7 @@ function expectedProblemDescription() result (expected)
272272
! cable 5 - shieldedMultiwire
273273
allocate(shielded_multiwire_t :: expected%mtln%cables(5)%ptr)
274274
ptr => expected%mtln%cables(5)%ptr
275-
call initializeCablePULParameters(ptr)
275+
call initializeCablePULParameters(ptr, n=1)
276276
select type(ptr)
277277
type is (shielded_multiwire_t)
278278
ptr%name = "line_1_1"
@@ -346,7 +346,7 @@ function expectedProblemDescription() result (expected)
346346
! cable 7 - wire
347347
allocate(unshielded_multiwire_t :: expected%mtln%cables(7)%ptr)
348348
ptr => expected%mtln%cables(7)%ptr
349-
call initializeCablePULParameters(ptr)
349+
call initializeCablePULParameters(ptr, n=1)
350350
select type(ptr)
351351
type is (unshielded_multiwire_t)
352352
ptr%name = "line_0_2"
@@ -374,7 +374,7 @@ function expectedProblemDescription() result (expected)
374374
! cable 8 - shieldedMultiwire
375375
allocate(shielded_multiwire_t :: expected%mtln%cables(8)%ptr)
376376
ptr => expected%mtln%cables(8)%ptr
377-
call initializeCablePULParameters(ptr)
377+
call initializeCablePULParameters(ptr, n=1)
378378
select type(ptr)
379379
type is (shielded_multiwire_t)
380380
ptr%name = "line_1_2"
@@ -408,7 +408,7 @@ function expectedProblemDescription() result (expected)
408408
! cable 9 - shieldedMultiwire
409409
allocate(shielded_multiwire_t :: expected%mtln%cables(9)%ptr)
410410
ptr => expected%mtln%cables(9)%ptr
411-
call initializeCablePULParameters(ptr,6)
411+
call initializeCablePULParameters(ptr,n=6)
412412
select type(ptr)
413413
type is (shielded_multiwire_t)
414414
ptr%name = "line_2_5"

0 commit comments

Comments
 (0)