Skip to content

Commit b7a4a5e

Browse files
authored
Merge pull request #171 from OpenSEMBA/dev
Dev
2 parents 0e61279 + 5ca6c82 commit b7a4a5e

20 files changed

+2688
-53
lines changed

doc/smbjson.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -576,9 +576,9 @@ Performs a loop integral along on the contour of the surface reference in the `e
576576

577577
+ If it is a point or a volume, `direction` must be present.
578578
+ For an oriented line, `direction` is optional and the orientation of the line will be used as default.
579-
+ For an oriented surface, `direction` is also optional, and if not value is given it is assumed to be the normal of the surface.
579+
+ For an oriented surface, `direction` is also optional, and if not value is given it is assumed to be the the positive axis of the surface normal.
580580

581-
Due to Ampere's law, the loop integral of the magnetic field is equal to the total electric current passing through the surfaces. `[field]`, can be `electric` or `magnetic`. Defaults to `electric`, which gives the total current passing through the surface.
581+
Due to Ampere's law, the loop integral of the magnetic field is equal to the total electric current passing through the surfaces. `[field]`, can be `electric` or `magnetic`. Defaults to `electric`, which returns the total current passing through the surface.
582582

583583
In the following example `elementId` points an element describing a single oriented surface, therefore `direction` does not need to be stated explicitly.
584584

@@ -704,7 +704,7 @@ An example of a planewave propagating towards $\hat{z}$ and polarized in the $+\
704704

705705
This object represents a time-varying vector field applied along an oriented line with the same orientation of the line. Therefore, the `elementIds` within must contain only elements of type `cell` with `intervals` describing a collection of oriented lines. Additionally, it may contain:
706706

707-
+ `[field]` with a `electric` or `magnetic` label which indicates the vector field which will be applied. If not present, it defaults to `electric`.
707+
+ `[field]` with a `current` label which indicates the vector field which will be applied. If not present, it defaults to `current`.
708708
+ `[hardness]` with `soft` or `hard` label. A `soft` hardness indicated that the magnitude will be **added** to the field this situation is typical for a waveport. `hard` sources mean that the field is **substituted** by the value established by the `magnitudeFile`, which for an electric field `nodalSource` would be equivalent to a `pec` material if the magnitude is zero.
709709

710710
**Example:**

src_json_parser/nfdetypes_extension.F90

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -673,9 +673,7 @@ elemental logical function curr_field_src_eq(a, b)
673673
(a%n_C2P == b%n_C2P) .and. &
674674
(a%nombre == b%nombre) .and. &
675675
(a%isElec .eqv. b%isElec) .and. &
676-
(a%isMagnet .eqv. b%isMagnet) .and. &
677-
(a%isCurrent .eqv. b%isCurrent) .and. &
678-
(a%isField .eqv. b%isField) .and. &
676+
(a%isHard .eqv. b%isHard) .and. &
679677
(a%isInitialValue .eqv. b%isInitialValue)
680678
end function curr_field_src_eq
681679

src_json_parser/smbjson.F90

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -832,30 +832,36 @@ function readField(jns) result(res)
832832
type(Curr_Field_Src) :: res
833833
type(json_value), pointer :: jns, entry
834834
integer, dimension(:), allocatable :: elementIds
835+
character (len=BUFSIZE) :: nodalSourceName
835836
type(coords_scaled), dimension(:), allocatable :: coordsFromLinels
836837

837-
select case (this%getStrAt(jns, J_FIELD))
838-
case (J_FIELD_ELECTRIC)
839-
res%isField = .true.
838+
select case (this%getStrAt(jns, J_FIELD, default=J_FIELD_CURRENT))
839+
case (J_FIELD_CURRENT)
840840
res%isElec = .true.
841-
res%isMagnet = .false.
842-
res%isCurrent = .false.
843-
case (J_FIELD_MAGNETIC)
844-
res%isField = .true.
845-
res%isElec = .false.
846-
res%isMagnet = .true.
847-
res%isCurrent = .false.
848841
case default
849842
write(error_unit, *) 'Error reading current field source. Field label not recognized.'
850843
end select
844+
845+
select case (this%getStrAt(jns, J_SRC_NS_HARDNESS, default=J_SRC_NS_HARDNESS_SOFT))
846+
case (J_SRC_NS_HARDNESS_SOFT)
847+
res%isHard = .false.
848+
case (J_SRC_NS_HARDNESS_HARD)
849+
res%isHard = .true.
850+
case default
851+
write(error_unit, *) 'Error reading current field source. Hardness label not recognized.'
852+
end select
853+
851854
res%isInitialValue = .false.
855+
852856
res%nombre = trim(adjustl(this%getStrAt(jns, J_SRC_MAGNITUDE_FILE)))
853857

858+
nodalSourceName = this%getStrAt(jns, J_NAME, default=' ')
859+
854860
allocate(res%c1P(0))
855861
res%n_C1P = 0
856862

857863
elementIds = this%getIntsAt(jns, J_ELEMENTIDS)
858-
call cellRegionsToScaledCoords(res%C2P, this%mesh%getCellRegions(elementIds) )
864+
call cellRegionsToScaledCoords(res%C2P, this%mesh%getCellRegions(elementIds), nodalSourceName)
859865
res%n_C2P = size(res%C2p)
860866

861867
end function
@@ -1225,7 +1231,7 @@ function readBlockProbe(bp) result(res)
12251231
res%j2 = cs(1)%ye
12261232
res%k1 = cs(1)%zi
12271233
res%k2 = cs(1)%ze
1228-
res%nml = cs(1)%Or
1234+
res%nml = abs(cs(1)%Or)
12291235

12301236
res%outputrequest = trim(adjustl(this%getStrAt(bp, J_NAME)))
12311237
call setDomain(res, this%getDomain(bp, J_PR_DOMAIN))

src_json_parser/smbjson_labels.F90

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ module smbjson_labels_mod
164164
character (len=*), parameter :: J_SRC_PW_THETA = "theta"
165165
character (len=*), parameter :: J_SRC_PW_PHI = "phi"
166166

167+
! type(NodalSource)
168+
character (len=*), parameter :: J_SRC_NS_HARDNESS = "hardness"
169+
character (len=*), parameter :: J_SRC_NS_HARDNESS_SOFT = "soft"
170+
character (len=*), parameter :: J_SRC_NS_HARDNESS_HARD = "hard"
171+
167172
! --- probe types
168173
character (len=*), parameter :: J_PROBES = "probes"
169174

src_main_pub/nfde_types.F90

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -678,8 +678,7 @@ MODULE NFDETypes
678678
CHARACTER (LEN=BUFSIZE) :: nombre
679679
INTEGER (KIND=4) :: n_C1P = 0
680680
INTEGER (KIND=4) :: n_C2P = 0
681-
LOGICAL :: isElec, isMagnet
682-
LOGICAL :: isCurrent, isField, isInitialValue
681+
LOGICAL :: isElec, isHard, isInitialValue
683682
END TYPE Curr_Field_Src
684683
!------------------------------------------------------------------------------
685684
! Definicin de las Nodal Source global

src_main_pub/preprocess_geom.F90

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2896,8 +2896,8 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
28962896
!
28972897
sgg%NodalSource(conta1)%fichero%name = trim (adjustl(this%nodsrc%NodalSource(i)%nombre))
28982898
sgg%NodalSource(conta1)%isElec = this%nodsrc%NodalSource(i)%isElec
2899-
sgg%NodalSource(conta1)%IsHard = this%nodsrc%NodalSource(i)%isField
2900-
sgg%NodalSource(conta1)%IsInitialValue = this%nodsrc%NodalSource(i)%IsInitialValue
2899+
sgg%NodalSource(conta1)%IsHard = this%nodsrc%NodalSource(i)%isHard
2900+
sgg%NodalSource(conta1)%IsInitialValue = this%nodsrc%NodalSource(i)%IsInitialValue
29012901
endif
29022902
!
29032903
tama2 = this%nodsrc%NodalSource(i)%n_c1P
@@ -2929,7 +2929,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
29292929
!bug OLD 181214 sl_4_20mm_gli.nfde. Fuente nodal electrica embebida en pec y nodal magnetica en pmc se ignoraran sean hard or soft
29302930
MEDIO = sggmiEx (i1, j1, k1)
29312931
valido=.true.
2932-
!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
2932+
!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
29332933
! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
29342934
! & (sgg%Med(MEDIO)%Is%MDispersive)
29352935
!ELSE
@@ -2944,7 +2944,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
29442944
! COMENTADO 250816 PQ DA UN ERROR JUISTO CUANDO CAE LA FUENTE EN UN CORTE MPI. HABRIA QU TOCA LA CASUISTICA DE punto_s%ZE = Min (this%nodsrc%NodalSource(i)%c1P(ii)%ZE, Max(BoundingBox%ZI, BoundingBox%ZE )) PERO NO LO HE QUERIDO HACER
29452945
!!!MEDIO = sggmiHx (i1, j1, k1)
29462946
!!!valido=.true.
2947-
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
2947+
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
29482948
!!!! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
29492949
!!!! & (sgg%Med(MEDIO)%Is%MDispersive)
29502950
!!!!ELSE
@@ -2961,7 +2961,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
29612961
IF (punto_s%yc /= 0) THEN
29622962
MEDIO = sggmiEy (i1, j1, k1)
29632963
valido=.true.
2964-
!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
2964+
!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
29652965
! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
29662966
! & (sgg%Med(MEDIO)%Is%MDispersive)
29672967
!ELSE
@@ -2976,7 +2976,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
29762976
!
29772977
!!!MEDIO = sggmiHy (i1, j1, k1)
29782978
!!!valido=.true.
2979-
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
2979+
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
29802980
!!!! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
29812981
!!!! & (sgg%Med(MEDIO)%Is%MDispersive)
29822982
!!!!ELSE
@@ -2993,7 +2993,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
29932993
IF (punto_s%zc /= 0) THEN
29942994
MEDIO = sggmiEz (i1, j1, k1)
29952995
valido=.true.
2996-
!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
2996+
!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
29972997
! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
29982998
! & (sgg%Med(MEDIO)%Is%MDispersive)
29992999
!ELSE
@@ -3008,7 +3008,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
30083008
!
30093009
!!!MEDIO = sggmiHz (i1, j1, k1)
30103010
!!!valido=.true.
3011-
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
3011+
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
30123012
!!!! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
30133013
!!!! & (sgg%Med(MEDIO)%Is%MDispersive)
30143014
!!!!ELSE
@@ -3103,7 +3103,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
31033103
IF (punto_s%xc /= 0) THEN
31043104
MEDIO = sggmiEx (i1, j1, k1)
31053105
valido=.true.
3106-
!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
3106+
!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
31073107
! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
31083108
! & (sgg%Med(MEDIO)%Is%MDispersive)
31093109
!ELSE
@@ -3119,7 +3119,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
31193119
!
31203120
!!!MEDIO = sggmiHx (i1, j1, k1)
31213121
!!!valido=.true.
3122-
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
3122+
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
31233123
!!!! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
31243124
!!!! & (sgg%Med(MEDIO)%Is%MDispersive)
31253125
!!!!ELSE
@@ -3136,7 +3136,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
31363136
IF (punto_s%yc /= 0) THEN
31373137
MEDIO = sggmiEy (i1, j1, k1)
31383138
valido=.true.
3139-
!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
3139+
!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
31403140
! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
31413141
! & (sgg%Med(MEDIO)%Is%MDispersive)
31423142
!ELSE
@@ -3151,7 +3151,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
31513151
!
31523152
!!!MEDIO = sggmiHy (i1, j1, k1)
31533153
!!!valido=.true.
3154-
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
3154+
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
31553155
!!!! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
31563156
!!!! & (sgg%Med(MEDIO)%Is%MDispersive)
31573157
!!!!ELSE
@@ -3168,7 +3168,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
31683168
IF (punto_s%zc /= 0) THEN
31693169
MEDIO = sggmiEz (i1, j1, k1)
31703170
valido=.true.
3171-
!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
3171+
!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
31723172
! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
31733173
! & (sgg%Med(MEDIO)%Is%MDispersive)
31743174
!ELSE
@@ -3183,7 +3183,7 @@ SUBROUTINE read_geomData (sgg,sggMtag,tag_numbers, sggMiNo,sggMiEx,sggMiEy,sggMi
31833183
!
31843184
!!!MEDIO = sggmiHz (i1, j1, k1)
31853185
!!!valido=.true.
3186-
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isField) THEN
3186+
!!!!IF ( .NOT. this%nodsrc%NodalSource(i)%isHard) THEN
31873187
!!!! VALIDO = (sgg%Med(MEDIO)%Is%Dielectric) .OR. (sgg%Med(MEDIO)%Is%EDispersive) .OR. &
31883188
!!!! & (sgg%Med(MEDIO)%Is%MDispersive)
31893189
!!!!ELSE

src_pyWrapper/pyWrapper.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from vtk.util.numpy_support import vtk_to_numpy
1111
from itertools import product
1212
import copy
13+
import matplotlib.pyplot as plt
1314

1415
DEFAULT_SEMBA_FDTD_PATH = '/build/bin/semba-fdtd'
1516

@@ -194,6 +195,19 @@ def _positionStrToTwoCells(pos_str: str):
194195
def _getFieldAndDirection(tag: str):
195196
return tag[1], tag[2]
196197

198+
class ExcitationFile():
199+
def __init__(self, excitation_filename):
200+
if isinstance(excitation_filename, os.PathLike):
201+
self.filename = excitation_filename.as_posix()
202+
else:
203+
self.filename = excitation_filename
204+
assert os.path.isfile(self.filename)
205+
206+
self.data = pd.read_csv(self.filename, sep='\\s+', names=['time', 'value'])
207+
208+
def __getitem__(self, key):
209+
return self.data[key]
210+
197211

198212
class FDTD():
199213
def __init__(self, input_filename, path_to_exe=None,
@@ -335,6 +349,19 @@ def getSolvedProbeFilenames(self, probe_name):
335349

336350
return sorted(probeFiles)
337351

352+
def getExcitationFile(self, excitation_file_name):
353+
file_extensions =('*.1.exc',)
354+
excitationFile = []
355+
for ext in file_extensions:
356+
newExcitationFile = [x for x in glob.glob(ext) if re.match(excitation_file_name, x)]
357+
excitationFile.extend(newExcitationFile)
358+
359+
if ((len(excitationFile)) != 1):
360+
raise "Unexpected number of excitation Files found: {}".format(excitationFile)
361+
362+
return excitationFile
363+
364+
338365
def getVTKMap(self):
339366
current_path = os.getcwd()
340367
folders = [item for item in os.listdir(

test/pyWrapper/test_full_system.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,37 @@ def testCanExecuteFDTDFromFolderWithSpacesAndCanProcessAdditionalArguments(tmp_p
450450
solver.run()
451451
assert (Probe(solver.getSolvedProbeFilenames("outside")[0]) is not None)
452452
assert (solver.getVTKMap()[0] is not None)
453+
454+
455+
def test_nodal_source(tmp_path):
456+
fn = CASES_FOLDER + "nodalSource/nodalSource.fdtd.json"
457+
assert (os.path.isfile(fn))
458+
solver = FDTD(fn, path_to_exe=SEMBA_EXE, run_in_folder=tmp_path)
459+
solver.run()
460+
461+
resistanceBulkProbe = Probe( \
462+
solver.getSolvedProbeFilenames("Bulk probe Resistance")[0])
463+
nodalBulkProbe = Probe( \
464+
solver.getSolvedProbeFilenames("Bulk probe Nodal Source")[0])
465+
excitation = ExcitationFile( \
466+
excitation_filename=solver.getExcitationFile("predefinedExcitation")[0])
467+
468+
# For debugging.
469+
# plt.figure()
470+
# plt.plot(resistanceBulkProbe['time'].to_numpy(),
471+
# resistanceBulkProbe['current'].to_numpy(), label='BP Current@resistance')
472+
# plt.plot(excitation.data['time'].to_numpy(),
473+
# excitation.data['value'].to_numpy(), label='excited current')
474+
# plt.plot(nodalBulkProbe['time'].to_numpy(),
475+
# -nodalBulkProbe['current'].to_numpy(), label='BP Current@nodal source')
476+
# plt.legend()
477+
478+
exc = np.interp(nodalBulkProbe['time'].to_numpy(),
479+
excitation.data['time'].to_numpy(),
480+
excitation.data['value'].to_numpy())
481+
assert np.corrcoef(exc, -nodalBulkProbe['current'])[0,1] > 0.999
482+
assert np.corrcoef(-nodalBulkProbe['current'], resistanceBulkProbe['current'])[0,1] > 0.998
483+
453484

454485
def testCanAssignSameSurfaceImpedanceToMultipleGeometries(tmp_path):
455486
fn = CASES_FOLDER + 'multipleAssigments/multipleSurfaceImpedance.fdtd.json'

test/pyWrapper/test_pyWrapper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,4 @@ def test_casemaker_sphere_rcs_case(tmp_path):
212212
case_name + ".fdtd.json",
213213
path_to_exe=SEMBA_EXE)
214214
solver.run()
215-
assert solver.hasFinishedSuccessfully()
215+
assert solver.hasFinishedSuccessfully()

test/smbjson/test_read_airplane.F90

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,7 @@ function expectedProblemDescription() result (expected)
6565
allocate(expected%nodSrc%NodalSource(1))
6666
expected%nodSrc%NodalSource(1)%nombre = "gauss.exc"
6767
expected%nodSrc%NodalSource(1)%isElec = .true.
68-
expected%nodSrc%NodalSource(1)%isMagnet = .false.
69-
expected%nodSrc%NodalSource(1)%isCurrent = .false.
70-
expected%nodSrc%NodalSource(1)%isField = .true.
68+
expected%nodSrc%NodalSource(1)%isHard = .false.
7169
expected%nodSrc%NodalSource(1)%isInitialValue = .false.
7270
allocate(expected%nodSrc%NodalSource(1)%c1P(0))
7371
allocate(expected%nodSrc%NodalSource(1)%c2P(1))
@@ -79,7 +77,7 @@ function expectedProblemDescription() result (expected)
7977
expected%nodSrc%NodalSource(1)%c2P(1)%Ye = 30
8078
expected%nodSrc%NodalSource(1)%c2P(1)%Zi = 39
8179
expected%nodSrc%NodalSource(1)%c2P(1)%Ze = 46
82-
expected%nodSrc%NodalSource(1)%c2P(1)%tag = ''
80+
expected%nodSrc%NodalSource(1)%c2P(1)%tag = 'nodalSource'
8381
expected%nodSrc%NodalSource(1)%c2P(1)%xc = 0.0
8482
expected%nodSrc%NodalSource(1)%c2P(1)%yc = 0.0
8583
expected%nodSrc%NodalSource(1)%c2P(1)%zc = 1.0

0 commit comments

Comments
 (0)