Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
ppmnumerics
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Sbalzarini Lab
Software
Parallel Computing
PPM
ppmnumerics
Commits
25fc7144
Commit
25fc7144
authored
12 years ago
by
Omar Awile
Browse files
Options
Downloads
Patches
Plain Diff
Checking ode stepping on meshes
parent
55cc5e3a
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/ode/test/ppm_module_ode_typedef.fun
+362
-32
362 additions, 32 deletions
src/ode/test/ppm_module_ode_typedef.fun
with
362 additions
and
32 deletions
src/ode/test/ppm_module_ode_typedef.fun
+
362
−
32
View file @
25fc7144
...
...
@@ -2,6 +2,7 @@ test_suite ppm_module_ode_typedef
use
ppm_module_core
use
ppm_module_user_numerics
use
ppm_module_ode_typedef
#ifdef
__
MPI
INCLUDE
"mpif.h"
...
...
@@ -15,7 +16,7 @@ real(mk),parameter :: skin = 0._mk
integer
,
parameter
::
ndim
=
2
integer
::
decomp
,
assig
,
tolexp
integer
::
info
,
comm
,
rank
,
nproc
,
topoid
integer
::
np_global
=
30
00
integer
::
np_global
=
1
00
real
(
mk
)
::
cutoff
real
(
mk
),
dimension
(:,:),
pointer
::
xp
=>
NULL
()
real
(
mk
),
dimension
(:
),
pointer
::
min_phys
=>
NULL
(),
max_phys
=>
NULL
()
...
...
@@ -25,6 +26,8 @@ integer :: nstep
integer
,
dimension
(
3
)
::
ldc
integer
,
dimension
(
6
)
::
bcdef
real
(
mk
),
dimension
(:
),
pointer
::
cost
=>
NULL
()
integer
,
dimension
(:
),
pointer
::
nm
=>
NULL
()
integer
,
dimension
(:
),
pointer
::
ighostsize
=>
NULL
()
integer
::
isymm
=
0
real
(
mk
)
::
t0
,
t1
,
t2
,
t3
integer
::
seedsize
...
...
@@ -52,14 +55,14 @@ integer :: nterms
use
ppm_module_init
use
ppm_module_mktopo
allocate
(
min_phys
(
ndim
),
max_phys
(
ndim
),
len_phys
(
ndim
),
stat
=
info
)
allocate
(
ighostsize
(
ndim
),
nm
(
ndim
),
min_phys
(
ndim
),
max_phys
(
ndim
),
len_phys
(
ndim
),
stat
=
info
)
min_phys
(
1
:
ndim
)
=
0.0
_
mk
max_phys
(
1
:
ndim
)
=
1.0
_
mk
max_phys
(
ndim
)
=
1.4
_
mk
len_phys
(
1
:
ndim
)
=
max_phys-min_phys
bcdef
(
1
:
6
)
=
ppm_param_bcdef_periodic
ighostsize
(
1
:
ndim
)
=
2
#ifdef
__
MPI
comm
=
mpi_comm_world
call
mpi_comm_rank
(
comm
,
rank
,
info
)
...
...
@@ -116,22 +119,28 @@ integer :: nterms
end
teardown
test
PSE_client
test
ode_wp_step
use
ppm_module_io_vtk
type
(
ppm_t_particles_d
)
::
Part1
type
(
ppm_t_field
)
::
Field1
type
(
ppm_t_
field
)
::
Field2
type
(
ppm_t_o
perator
)
::
Laplacian
type
(
ppm_t_particles_d
)
,
target
::
Part1
class
(
ppm_t_field
_
)
,
pointer
::
Field1
class
(
ppm_t_
main_abstr
)
,
pointer
::
el
type
(
ppm_t_o
de
)
::
ode
CLASS
(
ppm_t_operator_discr
)
,
POINTER
::
DCop
=>
NULL
()
CLASS
(
ppm_t_operator_discr
)
,
POINTER
::
PSEop
=>
NULL
()
class
(
ppm_t_neighlist_d_
)
,
POINTER
::
Nlist
=>
NULL
()
class
(
ppm_t_discr_data
)
,
POINTER
::
prop
=>
NULL
()
class
(
ppm_v_main_abstr
)
,
pointer
::
fields
class
(
ppm_v_field_discr_pair
)
,
pointer
::
rhs_fields
real
(
mk
)
::
t
,
dt
procedure
(
ppm_p_rhsfunc
)
,
pointer
::
rhsptr
class
(
ppm_t_field_discr_pair
)
,
pointer
::
pair
!--------------------------
!Define
Fields
!--------------------------
c
all
Field1%create
(
5
,
info
,
name=
"
Concentration
"
)
!vector
field
all
ocate
(
ppm_t_field::Field1
,
stat=info
)
Assert_Equal
(
info
,
0
)
call
Field1%create
(
1
,
info
,
name=
"
Concentration
"
)
!vector
field
call
Part1%initialize
(
np_global
,
info
,
topoid=topoid
,
name=
"
Part1
"
)
Assert_Equal
(
info
,
0
)
...
...
@@ -140,62 +149,383 @@ integer :: nterms
!
CALL
ppm_vtk_particles
(
"
part_test
"
,
Part1
,
info
)
!
Assert_Equal
(
info
,
0
)
call
Part1%set_cutoff
(
3
.
_mk
*
Part1%h_avg
,
info
)
call
Part1%set_cutoff
(
1
.
_mk
*
Part1%h_avg
,
info
)
Assert_Equal
(
info
,
0
)
allocate
(
wp_2r
(
ndim
,
Part1%Npart
)
)
call
random_number
(
wp_2r
)
wp_2r
=
(
wp_2r
-
0.5
_
mk
)
*
Part1%h_avg
*
0.15
_
mk
call
Part1%move
(
wp_2r
,
info
)
call
Part1%map
(
info
,
global=
.
true
.
,
topoid=topoid
)
Assert_Equal
(
info
,
0
)
deallocate
(
wp_2r
)
Assert_true
(
Part1%has_neighlist
(
Part1
))
call
Part1%apply_bc
(
info
)
call
Part1%map_ghosts
(
info
)
Assert_Equal
(
info
,
0
)
call
Part1%map
(
info
,
global
=
.
true
.
,
topoid
=
topoid
)
call
Field1%discretize_on
(
Part1
,
info
)
Assert_Equal
(
info
,
0
)
call
Part1%map_ghosts
(
info
)
Assert_Equal
(
info
,
0
)
call
Field1%discretize_on
(
Part1
,
info
)
call
Part1%get_field
(
Field1
,
wp_1r
,
info
)
Assert_Equal
(
info
,
0
)
wp_1r
(
:
)
=
1.0
_
mk
allocate
(
fields
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
allocate
(
rhs_fields
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
allocate
(
pair
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
el
=>
Field1
call
fields%push
(
el
,
info
)
pair%field
=>
Field1
pair%discretization
=>
Part1
call
rhs_fields%push
(
pair
,
info
)
rhsptr
=>
rhs_test1
call
ode%create
(
ppm_param_ode_scheme_eulerf
,
fields
,
rhsptr
,
rhs_fields
,
info
)
Assert_Equal
(
info
,
0
)
t
=
0.0
_
mk
dt
=
0.1
_
mk
call
ode%step
(
t
,
dt
,
info
)
Assert_Equal
(
info
,
0
)
call
Part1%get_field
(
Field1
,
wp_1r
,
info
)
Assert_Equal
(
info
,
0
)
Assert_True
(((
minval
(
wp_1r
)
.
eq
.
1
.
2_mk
)
.
and
.
(
maxval
(
wp_1r
)
.
eq
.
1
.
2_mk
)))
call
ode%destroy
(
info
)
Assert_Equal
(
info
,
0
)
call
Part1%destroy
(
info
)
Assert_Equal
(
info
,
0
)
call
Field1%destroy
(
info
)
Assert_Equal
(
info
,
0
)
deallocate
(
Field1
,
fields
,
rhs_fields
,
pair
)
end
test
test
ode_xp_step
use
ppm_module_io_vtk
type
(
ppm_t_particles_d
)
,
target
::
Part1
class
(
ppm_t_field_
)
,
pointer
::
Field1
class
(
ppm_t_main_abstr
)
,
pointer
::
el
type
(
ppm_t_ode
)
::
ode
CLASS
(
ppm_t_operator_discr
)
,
POINTER
::
DCop
=>
NULL
()
CLASS
(
ppm_t_operator_discr
)
,
POINTER
::
PSEop
=>
NULL
()
class
(
ppm_t_neighlist_d_
)
,
POINTER
::
Nlist
=>
NULL
()
class
(
ppm_t_discr_data
)
,
POINTER
::
prop
=>
NULL
()
class
(
ppm_v_main_abstr
)
,
pointer
::
fields
class
(
ppm_v_field_discr_pair
)
,
pointer
::
rhs_fields
real
(
mk
)
::
t
,
dt
procedure
(
ppm_p_rhsfunc
)
,
pointer
::
rhsptr
class
(
ppm_t_field_discr_pair
)
,
pointer
::
pair
real
(
mk
)
,
dimension
(
:
,
:
)
,
pointer
::
moved_xp=>NULL
()
start_subroutine
(
"
ode_xp_step
"
)
!--------------------------
!
Define
Fields
!--------------------------
allocate
(
ppm_t_field::Field1
,
stat=info
)
Assert_Equal
(
info
,
0
)
call
Field1%create
(
1
,
info
,
name=
"
Concentration
"
)
!vector
field
call
Part1%initialize
(
np_global
,
info
,
topoid=topoid
,
name=
"
Part1
"
)
Assert_Equal
(
info
,
0
)
!
print
particles
to
a
VTK
file
!
CALL
ppm_vtk_particles
(
"
part_test
"
,
Part1
,
info
)
!
Assert_Equal
(
info
,
0
)
call
Part1%set_cutoff
(
1
.
_mk
*
Part1%h_avg
,
info
)
Assert_Equal
(
info
,
0
)
call
Part1%
set_xp
(
xp
,
info
,
read_only
=
.
true
.
)
call
Part1%
map
(
info
,
global=
.
true
.
,
topoid=topoid
)
Assert_Equal
(
info
,
0
)
call
Part1%map_ghosts
(
info
)
Assert_Equal
(
info
,
0
)
call
Field1%discretize_on
(
Part1
,
info
)
Assert_Equal
(
info
,
0
)
call
Part1%map_ghosts
(
info
)
Assert_Equal
(
info
,
0
)
call
Part1%get_field
(
Field1
,
wp_1r
,
info
)
Assert_Equal
(
info
,
0
)
wp_1r
(
:
)
=
1.0
_
mk
call
Part1%get_xp
(
moved_xp
,
info
)
allocate
(
xp
(
ppm_dim
,
Part1%Npart
))
xp
(:,:)
=
moved_xp
(:,:)
allocate
(
fields
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
allocate
(
rhs_fields
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
allocate
(
pair
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
el
=>
Part1
call
fields%push
(
el
,
info
)
pair%field
=>
Field1
pair%discretization
=>
Part1
call
rhs_fields%push
(
pair
,
info
)
rhsptr
=>
rhs_test2
call
ode%create
(
ppm_param_ode_scheme_eulerf
,
fields
,
rhsptr
,
rhs_fields
,
info
)
Assert_Equal
(
info
,
0
)
t
=
0.0
_
mk
dt
=
0.1
_
mk
call
ode%step
(
t
,
dt
,
info
)
Assert_Equal
(
info
,
0
)
call
Part1%get_xp
(
moved_xp
,
info
)
do
i
=
1
,
Part1%Npart
xp
(:,
i
)
=
moved_xp
(:,
i
)
-
xp
(:,
i
)
enddo
Assert_True
(((
abs
(
minval
(
xp
(:,
1
:
Part1%Npart
))
-
0.2
_
mk
)
.
le
.
tol
)
.
and
.
(
abs
(
maxval
(
xp
(:,
1
:
Part1%Npart
))
-
0.2
_
mk
)
.
le
.
tol
)))
call
ode%destroy
(
info
)
Assert_Equal
(
info
,
0
)
call
Part1%destroy
(
info
)
Assert_Equal
(
info
,
0
)
call
Field1%destroy
(
info
)
Assert_Equal
(
info
,
0
)
deallocate
(
degree
,
coeffs
,
order
)
deallocate
(
Field1
,
fields
,
rhs_fields
,
pair
,
xp
)
end_subroutine
()
end
test
!-------------------------------------------------------------
!
test
function
!-------------------------------------------------------------
pure
function
f0_test
(
pos
,
ndim
)
test
ode_mesh_step
class
(
ppm_t_field_
),
POINTER
::
Field1
,
Field2
class
(
ppm_t_equi_mesh
),
POINTER
::
Mesh1
!real
(
mk
),
dimension
(:,:,:),
pointer
::
Field1_data2d
=>
NULL
()
!real
(
mk
),
dimension
(:,:),
pointer
::
Field2_data2d
=>
NULL
()
!real
(
mk
),
dimension
(:,:,:,:),
pointer
::
Field1_data3d
=>
NULL
()
!real
(
mk
),
dimension
(:,:,:),
pointer
::
Field2_data3d
=>
NULL
()
type
(
ppm_t_ode
)
::
ode
integer
::
p_idx
,
nb_errors
CLASS
(
ppm_t_discr_info_
)
,
POINTER
::
dinfo
=>
NULL
()
logical
::
assoc
real
(
mk
)
,
dimension
(
2*ndim
)
::
my_patch
real
(
mk
)
,
dimension
(
ndim
)
::
offset
real
(
mk
)
::
t
,
dt
procedure
(
ppm_p_rhsfunc
)
,
pointer
::
rhsptr
class
(
ppm_v_main_abstr
)
,
pointer
::
fields
class
(
ppm_v_field_discr_pair
)
,
pointer
::
rhs_fields
class
(
ppm_t_field_discr_pair
)
,
pointer
::
fpair1
class
(
ppm_t_field_discr_pair
)
,
pointer
::
fpair2
class
(
ppm_t_main_abstr
)
,
pointer
::
el
start_subroutine
(
"
ode_mesh_step
"
)
Nm
=
25
Nm
(
ndim
)
=
45
allocate
(
Mesh1
,
stat
=
info
)
call
Mesh1%create
(
topoid
,
offset
,
info
,
Nm
=
Nm
,
&
ghostsize
=
ighostsize
,
name
=
'Test_Mesh_1'
)
Assert_Equal
(
info
,
0
)
real
(
mk
)
::
f0_test
integer
,
intent
(
in
)
::
ndim
real
(
mk
),
dimension
(
ndim
),
intent
(
in
)
::
pos
if
(
ndim
.
eq
.
2
)
then
my_patch
(
1
:
4
)
=
(
/
0.15
_
mk
,
0.10
_
mk
,
0.99
_
mk
,
0.7
_
mk/
)
else
my_patch
(
1
:
6
)
=
(
/
0.15
_
mk
,
0.10
_
mk
,
0.51
_
mk
,
0.99
_
mk
,
0.7
_
mk
,
0.78
_
mk/
)
endif
f0_test
=
sin
(
2
.
_
mk*pi*pos
(
1
))
*
cos
(
2
.
_
mk*pi*pos
(
2
))
*
&
&
sin
(
2
.
_
mk*pi*pos
(
ndim
)
)
call
Mesh1%def_patch
(
my_patch
,
info
)
Assert_Equal
(
info
,
0
)
return
allocate
(
ppm_t_field::Field1
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
allocate
(
ppm_t_field::Field2
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
call
Field1%create
(
2
,
info
,
name
=
'vecField'
)
Assert_Equal
(
info
,
0
)
call
Field1%discretize_on
(
Mesh1
,
info
)
Assert_Equal
(
info
,
0
)
call
Field2%create
(
1
,
info
,
name
=
'scaField'
)
Assert_Equal
(
info
,
0
)
call
Field2%discretize_on
(
Mesh1
,
info
)
Assert_Equal
(
info
,
0
)
IF
(
ndim
.
EQ
.
2
)
THEN
foreach
n
in
equi_mesh
(
Mesh1
)
with
sca_fields
(
Field2
)
vec_fields
(
Field1
)
indices
(
i
,
j
)
for
real
Field1_n
(:)
=
1
.
_
mk
Field2_n
=
2
.
_
mk
end
foreach
ELSE
foreach
n
in
equi_mesh
(
Mesh1
)
with
sca_fields
(
Field2
)
vec_fields
(
Field1
)
indices
(
i
,
j
,
k
)
for
real
Field1_n
(:)
=
1
.
_
mk
Field2_n
=
2
.
_
mk
end
foreach
ENDIF
!Do
a
ghost
mapping
call
Mesh1%map_ghost_get
(
info
)
Assert_Equal
(
info
,
0
)
call
Field1%map_ghost_push
(
Mesh1
,
info
)
Assert_Equal
(
info
,
0
)
call
Field2%map_ghost_push
(
Mesh1
,
info
)
Assert_Equal
(
info
,
0
)
call
Mesh1%map_send
(
info
)
Assert_Equal
(
info
,
0
)
call
Field2%map_ghost_pop
(
Mesh1
,
info
)
Assert_Equal
(
info
,
0
)
call
Field1%map_ghost_pop
(
Mesh1
,
info
)
Assert_Equal
(
info
,
0
)
allocate
(
fields
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
allocate
(
rhs_fields
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
el
=>
Field2
call
fields%push
(
el
,
info
)
allocate
(
fpair1
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
fpair1%field
=>
Field1
fpair1%discretization
=>
Mesh1
call
rhs_fields%push
(
fpair1
,
info
)
allocate
(
fpair2
,
stat
=
info
)
Assert_Equal
(
info
,
0
)
fpair2%field
=>
Field2
fpair2%discretization
=>
Mesh1
call
rhs_fields%push
(
fpair2
,
info
)
end
function
f0_test
rhsptr
=>
rhs_test3
call
ode%create
(
ppm_param_ode_scheme_eulerf
,
fields
,
rhsptr
,
rhs_fields
,
info
)
Assert_Equal
(
info
,
0
)
t
=
0.0
_
mk
dt
=
0.1
_
mk
call
ode%step
(
t
,
dt
,
info
)
Assert_Equal
(
info
,
0
)
IF
(
ndim
.
EQ
.
2
)
THEN
foreach
n
in
equi_mesh
(
Mesh1
)
with
sca_fields
(
Field2
)
vec_fields
(
Field1
)
indices
(
i
,
j
)
for
real
Assert_Equal
(
Field2_n
,
2.6
_
mk
)
end
foreach
ELSE
foreach
n
in
equi_mesh
(
Mesh1
)
with
sca_fields
(
Field2
)
vec_fields
(
Field1
)
indices
(
i
,
j
,
k
)
for
real
Assert_Equal
(
Field2_n
,
2.6
_
mk
)
end
foreach
ENDIF
call
Mesh1%destroy
(
info
)
Assert_Equal
(
info
,
0
)
call
Field1%destroy
(
info
)
Assert_Equal
(
info
,
0
)
call
Field2%destroy
(
info
)
Assert_Equal
(
info
,
0
)
end_subroutine
()
end
test
!-------------------------------------------------------------
!
right
hand
sides
!-------------------------------------------------------------
integer
function
rhs_test1
(
fields_discr
,
changes
)
class
(
ppm_v_field_discr_pair
),
pointer
::
fields_discr
class
(
ppm_v_field
),
pointer
::
changes
class
(
ppm_t_main_abstr
),
pointer
::
m
class
(
ppm_t_field_discr_pair
),
pointer
::
pair
real
(
mk
),
dimension
(:),
pointer
::
wp
=>
null
()
real
(
mk
),
dimension
(:),
pointer
::
dwp
=>
null
()
class
(
ppm_t_field_
),
pointer
::
df
class
(
ppm_t_particles_d
),
pointer
::
pset
=>
null
()
start_subroutine
(
"rhs_test1"
)
pair
=>
fields_discr%at
(
1
)
select
type
(
d
=>
pair%discretization
)
class
is
(
ppm_t_particles_d
)
pset
=>
d
end
select
check_associated
(
pset
,
"type mismatch"
)
df
=>
changes%at
(
1
)
foreach
p
in
particles
(
pset
)
with
sca_fields
(
w
=
pair%field
,
dw
=
df
)
dw_p
=
2.0
_
mk*w_p
end
foreach
rhs_test1
=
0
end_subroutine
()
end
function
rhs_test1
integer
function
rhs_test2
(
fields_discr
,
changes
)
class
(
ppm_v_field_discr_pair
),
pointer
::
fields_discr
class
(
ppm_v_field
),
pointer
::
changes
class
(
ppm_t_main_abstr
),
pointer
::
m
class
(
ppm_t_field_discr_pair
),
pointer
::
pair
real
(
mk
),
dimension
(:),
pointer
::
wp
=>
null
()
real
(
mk
),
dimension
(:,:),
pointer
::
dxp
=>
null
()
class
(
ppm_t_field_
),
pointer
::
df
class
(
ppm_t_discr_info_
),
pointer
::
di
=>
null
()
class
(
ppm_t_particles_d
),
pointer
::
pset
=>
null
()
start_subroutine
(
"rhs_test2"
)
pair
=>
fields_discr%at
(
1
)
select
type
(
d
=>
pair%discretization
)
class
is
(
ppm_t_particles_d
)
pset
=>
d
end
select
check_associated
(
pset
,
"type mismatch"
)
df
=>
changes%at
(
1
)
foreach
p
in
particles
(
pset
)
with
sca_fields
(
w
=
pair%field
)
vec_fields
(
dx
=
df
)
dx_p
(:)
=
2.0
_
mk*w_p
end
foreach
rhs_test2
=
0
end_subroutine
()
end
function
rhs_test2
integer
function
rhs_test3
(
fields_discr
,
changes
)
class
(
ppm_v_field_discr_pair
),
pointer
::
fields_discr
class
(
ppm_v_field
),
pointer
::
changes
class
(
ppm_t_main_abstr
),
pointer
::
m
class
(
ppm_t_field_discr_pair
),
pointer
::
pair
class
(
ppm_t_field_
),
pointer
::
field1
,
field2
,
dfield
class
(
ppm_t_equi_mesh
),
pointer
::
mesh
=>
null
()
start_subroutine
(
"rhs_test3"
)
pair
=>
fields_discr%at
(
1
)
field1
=>
pair%field
select
type
(
d
=>
pair%discretization
)
class
is
(
ppm_t_equi_mesh
)
mesh
=>
d
end
select
check_associated
(
mesh
,
"type mismatch"
)
pair
=>
fields_discr%at
(
2
)
field2
=>
pair%field
dfield
=>
changes%at
(
1
)
IF
(
ndim
.
EQ
.
2
)
THEN
foreach
n
in
equi_mesh
(
mesh
)
with
sca_fields
(
field2
,
dfield
)
vec_fields
(
field1
)
indices
(
i
,
j
)
for
real
!field1_n
(:)
=
1
.
_
mk
dfield_n
=
3
.
_
mk*field2_n
end
foreach
ELSE
foreach
n
in
equi_mesh
(
mesh
)
with
sca_fields
(
field2
,
dfield
)
vec_fields
(
field1
)
indices
(
i
,
j
,
k
)
for
real
!field1_n
(:)
=
1
.
_
mk
dfield_n
=
3
.
_
mk*field2_n
end
foreach
ENDIF
rhs_test3
=
0
end_subroutine
()
end
function
rhs_test3
end
test_suite
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment