Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
LGPU FPP
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Fernando Pérez Panadero
LGPU FPP
Commits
a8f7442d
Commit
a8f7442d
authored
Nov 17, 2023
by
Fernando Pérez Panadero
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
All the dirac operators included with one kernel only
parent
94690bc0
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
248 additions
and
3 deletions
+248
-3
src/Dirac/Dirac.jl
src/Dirac/Dirac.jl
+247
-2
src/LatticeGPU.jl
src/LatticeGPU.jl
+1
-1
No files found.
src/Dirac/Dirac.jl
View file @
a8f7442d
...
@@ -446,7 +446,6 @@ function krnl_csw!(csw::AbstractArray{T}, U, Ubnd, ipl, lp::SpaceParm{4,M,B,D})
...
@@ -446,7 +446,6 @@ function krnl_csw!(csw::AbstractArray{T}, U, Ubnd, ipl, lp::SpaceParm{4,M,B,D})
return
nothing
return
nothing
end
end
function
Dw_new
!
(
so
,
U
,
si
,
dpar
::
DiracParam
,
dws
::
DiracWorkspace
,
lp
::
SpaceParm
{
4
,
6
,
B
,
D
})
where
{
B
,
D
}
function
Dw_new
!
(
so
,
U
,
si
,
dpar
::
DiracParam
,
dws
::
DiracWorkspace
,
lp
::
SpaceParm
{
4
,
6
,
B
,
D
})
where
{
B
,
D
}
if
abs
(
dpar
.
csw
)
>
1.0E-10
if
abs
(
dpar
.
csw
)
>
1.0E-10
...
@@ -611,6 +610,252 @@ function krnl_Dw_new!(so, U, si, m0, th, ct, lp::SpaceParm{4,6,BC_SF_ORBI,D}) wh
...
@@ -611,6 +610,252 @@ function krnl_Dw_new!(so, U, si, m0, th, ct, lp::SpaceParm{4,6,BC_SF_ORBI,D}) wh
return
nothing
return
nothing
end
end
function
g5Dw_new
!
(
so
,
U
,
si
,
dpar
::
DiracParam
,
dws
::
DiracWorkspace
,
lp
::
SpaceParm
{
4
,
6
,
B
,
D
})
where
{
B
,
D
}
if
abs
(
dpar
.
csw
)
>
1.0E-10
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dwimpr_new!
(
so
,
U
,
si
,
dws
.
csw
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
csw
,
dpar
.
ct
,
lp
)
end
end
else
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dw_new!
(
so
,
U
,
si
,
dpar
.
m0
,
dpar
.
th
,
lp
)
end
end
end
return
nothing
end
function
krnl_g5Dwimpr_new
!
(
so
,
U
,
si
,
Fcsw
,
m0
,
th
,
csw
,
lp
::
SpaceParm
{
4
,
6
,
B
,
D
})
where
{
B
,
D
}
b
=
Int64
(
CUDA
.
threadIdx
()
.
x
);
r
=
Int64
(
CUDA
.
blockIdx
()
.
x
)
bu1
,
ru1
=
up
((
b
,
r
),
1
,
lp
)
bd1
,
rd1
=
dw
((
b
,
r
),
1
,
lp
)
bu2
,
ru2
=
up
((
b
,
r
),
2
,
lp
)
bd2
,
rd2
=
dw
((
b
,
r
),
2
,
lp
)
bu3
,
ru3
=
up
((
b
,
r
),
3
,
lp
)
bd3
,
rd3
=
dw
((
b
,
r
),
3
,
lp
)
bu4
,
ru4
=
up
((
b
,
r
),
4
,
lp
)
bd4
,
rd4
=
dw
((
b
,
r
),
4
,
lp
)
@inbounds
begin
so
[
b
,
r
]
=
(
4
+
m0
)
*
si
[
b
,
r
]
+
0.5
*
csw
*
im
*
(
Fcsw
[
b
,
1
,
r
]
*
dmul
(
Gamma
{
10
},
si
[
b
,
r
])
+
Fcsw
[
b
,
2
,
r
]
*
dmul
(
Gamma
{
11
},
si
[
b
,
r
])
+
Fcsw
[
b
,
3
,
r
]
*
dmul
(
Gamma
{
12
},
si
[
b
,
r
])
-
Fcsw
[
b
,
4
,
r
]
*
dmul
(
Gamma
{
15
},
si
[
b
,
r
])
-
Fcsw
[
b
,
5
,
r
]
*
dmul
(
Gamma
{
14
},
si
[
b
,
r
])
-
Fcsw
[
b
,
6
,
r
]
*
dmul
(
Gamma
{
13
},
si
[
b
,
r
]))
so
[
b
,
r
]
-=
0.5
*
(
th
[
1
]
*
gpmul
(
Pgamma
{
1
,
-
1
},
U
[
b
,
1
,
r
],
si
[
bu1
,
ru1
])
+
conj
(
th
[
1
])
*
gdagpmul
(
Pgamma
{
1
,
+
1
},
U
[
bd1
,
1
,
rd1
],
si
[
bd1
,
rd1
])
+
th
[
2
]
*
gpmul
(
Pgamma
{
2
,
-
1
},
U
[
b
,
2
,
r
],
si
[
bu2
,
ru2
])
+
conj
(
th
[
2
])
*
gdagpmul
(
Pgamma
{
2
,
+
1
},
U
[
bd2
,
2
,
rd2
],
si
[
bd2
,
rd2
])
+
th
[
3
]
*
gpmul
(
Pgamma
{
3
,
-
1
},
U
[
b
,
3
,
r
],
si
[
bu3
,
ru3
])
+
conj
(
th
[
3
])
*
gdagpmul
(
Pgamma
{
3
,
+
1
},
U
[
bd3
,
3
,
rd3
],
si
[
bd3
,
rd3
])
+
th
[
4
]
*
gpmul
(
Pgamma
{
4
,
-
1
},
U
[
b
,
4
,
r
],
si
[
bu4
,
ru4
])
+
conj
(
th
[
4
])
*
gdagpmul
(
Pgamma
{
4
,
+
1
},
U
[
bd4
,
4
,
rd4
],
si
[
bd4
,
rd4
])
)
so
[
b
,
r
]
=
dmul
(
Gamma
{
5
},
so
[
b
,
r
])
end
return
nothing
end
function
krnl_g5Dw_new
!
(
so
,
U
,
si
,
m0
,
th
,
lp
::
SpaceParm
{
4
,
6
,
B
,
D
})
where
{
B
,
D
}
b
=
Int64
(
CUDA
.
threadIdx
()
.
x
);
r
=
Int64
(
CUDA
.
blockIdx
()
.
x
)
bu1
,
ru1
=
up
((
b
,
r
),
1
,
lp
)
bd1
,
rd1
=
dw
((
b
,
r
),
1
,
lp
)
bu2
,
ru2
=
up
((
b
,
r
),
2
,
lp
)
bd2
,
rd2
=
dw
((
b
,
r
),
2
,
lp
)
bu3
,
ru3
=
up
((
b
,
r
),
3
,
lp
)
bd3
,
rd3
=
dw
((
b
,
r
),
3
,
lp
)
bu4
,
ru4
=
up
((
b
,
r
),
4
,
lp
)
bd4
,
rd4
=
dw
((
b
,
r
),
4
,
lp
)
@inbounds
begin
so
[
b
,
r
]
=
(
4
+
m0
)
*
si
[
b
,
r
]
so
[
b
,
r
]
-=
0.5
*
(
th
[
1
]
*
gpmul
(
Pgamma
{
1
,
-
1
},
U
[
b
,
1
,
r
],
si
[
bu1
,
ru1
])
+
conj
(
th
[
1
])
*
gdagpmul
(
Pgamma
{
1
,
+
1
},
U
[
bd1
,
1
,
rd1
],
si
[
bd1
,
rd1
])
+
th
[
2
]
*
gpmul
(
Pgamma
{
2
,
-
1
},
U
[
b
,
2
,
r
],
si
[
bu2
,
ru2
])
+
conj
(
th
[
2
])
*
gdagpmul
(
Pgamma
{
2
,
+
1
},
U
[
bd2
,
2
,
rd2
],
si
[
bd2
,
rd2
])
+
th
[
3
]
*
gpmul
(
Pgamma
{
3
,
-
1
},
U
[
b
,
3
,
r
],
si
[
bu3
,
ru3
])
+
conj
(
th
[
3
])
*
gdagpmul
(
Pgamma
{
3
,
+
1
},
U
[
bd3
,
3
,
rd3
],
si
[
bd3
,
rd3
])
+
th
[
4
]
*
gpmul
(
Pgamma
{
4
,
-
1
},
U
[
b
,
4
,
r
],
si
[
bu4
,
ru4
])
+
conj
(
th
[
4
])
*
gdagpmul
(
Pgamma
{
4
,
+
1
},
U
[
bd4
,
4
,
rd4
],
si
[
bd4
,
rd4
])
)
so
[
b
,
r
]
=
dmul
(
Gamma
{
5
},
so
[
b
,
r
])
end
return
nothing
end
function
g5Dw_new
!
(
so
,
U
,
si
,
dpar
::
DiracParam
,
dws
::
DiracWorkspace
,
lp
::
SpaceParm
{
4
,
6
,
BC_SF_ORBI
,
D
})
where
{
D
}
if
abs
(
dpar
.
csw
)
>
1.0E-10
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dwimpr_new!
(
so
,
U
,
si
,
dws
.
csw
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
csw
,
dpar
.
ct
,
lp
)
end
end
else
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dw_new!
(
so
,
U
,
si
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
ct
,
lp
)
end
end
end
return
nothing
end
function
krnl_g5Dwimpr_new
!
(
so
,
U
,
si
,
Fcsw
,
m0
,
th
,
csw
,
ct
,
lp
::
SpaceParm
{
4
,
6
,
BC_SF_ORBI
,
D
})
where
{
D
}
# The field si is assumed to be zero at t = 0
b
=
Int64
(
CUDA
.
threadIdx
()
.
x
);
r
=
Int64
(
CUDA
.
blockIdx
()
.
x
)
if
(
point_time
((
b
,
r
),
lp
)
!=
1
)
bu1
,
ru1
=
up
((
b
,
r
),
1
,
lp
)
bd1
,
rd1
=
dw
((
b
,
r
),
1
,
lp
)
bu2
,
ru2
=
up
((
b
,
r
),
2
,
lp
)
bd2
,
rd2
=
dw
((
b
,
r
),
2
,
lp
)
bu3
,
ru3
=
up
((
b
,
r
),
3
,
lp
)
bd3
,
rd3
=
dw
((
b
,
r
),
3
,
lp
)
bu4
,
ru4
=
up
((
b
,
r
),
4
,
lp
)
bd4
,
rd4
=
dw
((
b
,
r
),
4
,
lp
)
@inbounds
begin
so
[
b
,
r
]
=
(
4
+
m0
)
*
si
[
b
,
r
]
+
0.5
*
csw
*
im
*
(
Fcsw
[
b
,
1
,
r
]
*
dmul
(
Gamma
{
10
},
si
[
b
,
r
])
+
Fcsw
[
b
,
2
,
r
]
*
dmul
(
Gamma
{
11
},
si
[
b
,
r
])
+
Fcsw
[
b
,
3
,
r
]
*
dmul
(
Gamma
{
12
},
si
[
b
,
r
])
-
Fcsw
[
b
,
4
,
r
]
*
dmul
(
Gamma
{
15
},
si
[
b
,
r
])
-
Fcsw
[
b
,
5
,
r
]
*
dmul
(
Gamma
{
14
},
si
[
b
,
r
])
-
Fcsw
[
b
,
6
,
r
]
*
dmul
(
Gamma
{
13
},
si
[
b
,
r
]))
so
[
b
,
r
]
-=
0.5
*
(
th
[
1
]
*
gpmul
(
Pgamma
{
1
,
-
1
},
U
[
b
,
1
,
r
],
si
[
bu1
,
ru1
])
+
conj
(
th
[
1
])
*
gdagpmul
(
Pgamma
{
1
,
+
1
},
U
[
bd1
,
1
,
rd1
],
si
[
bd1
,
rd1
])
+
th
[
2
]
*
gpmul
(
Pgamma
{
2
,
-
1
},
U
[
b
,
2
,
r
],
si
[
bu2
,
ru2
])
+
conj
(
th
[
2
])
*
gdagpmul
(
Pgamma
{
2
,
+
1
},
U
[
bd2
,
2
,
rd2
],
si
[
bd2
,
rd2
])
+
th
[
3
]
*
gpmul
(
Pgamma
{
3
,
-
1
},
U
[
b
,
3
,
r
],
si
[
bu3
,
ru3
])
+
conj
(
th
[
3
])
*
gdagpmul
(
Pgamma
{
3
,
+
1
},
U
[
bd3
,
3
,
rd3
],
si
[
bd3
,
rd3
])
+
th
[
4
]
*
gpmul
(
Pgamma
{
4
,
-
1
},
U
[
b
,
4
,
r
],
si
[
bu4
,
ru4
])
+
conj
(
th
[
4
])
*
gdagpmul
(
Pgamma
{
4
,
+
1
},
U
[
bd4
,
4
,
rd4
],
si
[
bd4
,
rd4
])
)
if
(
point_time
((
b
,
r
),
lp
)
==
2
)
||
(
point_time
((
b
,
r
),
lp
)
==
lp
.
iL
[
4
])
so
[
b
,
r
]
+=
(
ct
-
1.0
)
*
si
[
b
,
r
]
end
end
end
so
[
b
,
r
]
=
dmul
(
Gamma
{
5
},
so
[
b
,
r
])
return
nothing
end
function
krnl_g5Dw_new
!
(
so
,
U
,
si
,
m0
,
th
,
ct
,
lp
::
SpaceParm
{
4
,
6
,
BC_SF_ORBI
,
D
})
where
{
D
}
# The field si is assumed to be zero at t = 0
b
=
Int64
(
CUDA
.
threadIdx
()
.
x
);
r
=
Int64
(
CUDA
.
blockIdx
()
.
x
)
if
(
point_time
((
b
,
r
),
lp
)
!=
1
)
bu1
,
ru1
=
up
((
b
,
r
),
1
,
lp
)
bd1
,
rd1
=
dw
((
b
,
r
),
1
,
lp
)
bu2
,
ru2
=
up
((
b
,
r
),
2
,
lp
)
bd2
,
rd2
=
dw
((
b
,
r
),
2
,
lp
)
bu3
,
ru3
=
up
((
b
,
r
),
3
,
lp
)
bd3
,
rd3
=
dw
((
b
,
r
),
3
,
lp
)
bu4
,
ru4
=
up
((
b
,
r
),
4
,
lp
)
bd4
,
rd4
=
dw
((
b
,
r
),
4
,
lp
)
@inbounds
begin
so
[
b
,
r
]
=
(
4
+
m0
)
*
si
[
b
,
r
]
so
[
b
,
r
]
-=
0.5
*
(
th
[
1
]
*
gpmul
(
Pgamma
{
1
,
-
1
},
U
[
b
,
1
,
r
],
si
[
bu1
,
ru1
])
+
conj
(
th
[
1
])
*
gdagpmul
(
Pgamma
{
1
,
+
1
},
U
[
bd1
,
1
,
rd1
],
si
[
bd1
,
rd1
])
+
th
[
2
]
*
gpmul
(
Pgamma
{
2
,
-
1
},
U
[
b
,
2
,
r
],
si
[
bu2
,
ru2
])
+
conj
(
th
[
2
])
*
gdagpmul
(
Pgamma
{
2
,
+
1
},
U
[
bd2
,
2
,
rd2
],
si
[
bd2
,
rd2
])
+
th
[
3
]
*
gpmul
(
Pgamma
{
3
,
-
1
},
U
[
b
,
3
,
r
],
si
[
bu3
,
ru3
])
+
conj
(
th
[
3
])
*
gdagpmul
(
Pgamma
{
3
,
+
1
},
U
[
bd3
,
3
,
rd3
],
si
[
bd3
,
rd3
])
+
th
[
4
]
*
gpmul
(
Pgamma
{
4
,
-
1
},
U
[
b
,
4
,
r
],
si
[
bu4
,
ru4
])
+
conj
(
th
[
4
])
*
gdagpmul
(
Pgamma
{
4
,
+
1
},
U
[
bd4
,
4
,
rd4
],
si
[
bd4
,
rd4
])
)
if
(
point_time
((
b
,
r
),
lp
)
==
2
)
||
(
point_time
((
b
,
r
),
lp
)
==
lp
.
iL
[
4
])
so
[
b
,
r
]
+=
(
ct
-
1.0
)
*
si
[
b
,
r
]
end
end
end
so
[
b
,
r
]
=
dmul
(
Gamma
{
5
},
so
[
b
,
r
])
return
nothing
end
function
DwdagDw_new
!
(
so
,
U
,
si
,
dpar
::
DiracParam
,
dws
::
DiracWorkspace
,
lp
::
SpaceParm
{
4
,
6
,
BC_SF_ORBI
,
D
})
where
{
D
}
if
abs
(
dpar
.
csw
)
>
1.0E-10
@timeit
"DwdagDw_new"
begin
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dwimpr_new!
(
dws
.
st
,
U
,
si
,
dws
.
csw
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
csw
,
dpar
.
ct
,
lp
)
end
end
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dwimpr_new!
(
so
,
U
,
dws
.
st
,
dws
.
csw
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
csw
,
dpar
.
ct
,
lp
)
end
end
end
else
@timeit
"DwdagDw_new"
begin
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dw_new!
(
dws
.
st
,
U
,
si
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
ct
,
lp
)
end
end
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dw_new!
(
so
,
U
,
dws
.
st
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
ct
,
lp
)
end
end
end
end
return
nothing
end
function
DwdagDw_new
!
(
so
,
U
,
si
,
dpar
::
DiracParam
,
dws
::
DiracWorkspace
,
st
,
lp
::
SpaceParm
{
4
,
6
,
B
,
D
})
where
{
B
,
D
}
if
abs
(
dpar
.
csw
)
>
1.0E-10
@timeit
"DwdagDw_new"
begin
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dwimpr_new!
(
dws
.
st
,
U
,
si
,
dws
.
csw
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
csw
,
lp
)
end
end
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dwimpr_new!
(
so
,
U
,
dws
.
st
,
dws
.
csw
,
dpar
.
m0
,
dpar
.
th
,
dpar
.
csw
,
lp
)
end
end
end
else
@timeit
"DwdagDw_new"
begin
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dw_new!
(
dws
.
st
,
U
,
si
,
dpar
.
m0
,
dpar
.
th
,
lp
)
end
end
@timeit
"g5Dw_new"
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_g5Dw_new!
(
so
,
U
,
dws
.
st
,
dpar
.
m0
,
dpar
.
th
,
lp
)
end
end
end
end
return
nothing
end
function
SF_bndfix
!
(
sp
,
lp
::
SpaceParm
{
4
,
6
,
BC_SF_ORBI
,
D
})
where
{
D
}
function
SF_bndfix
!
(
sp
,
lp
::
SpaceParm
{
4
,
6
,
BC_SF_ORBI
,
D
})
where
{
D
}
CUDA
.
@sync
begin
CUDA
.
@sync
begin
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_sfbndfix_new!
(
sp
,
lp
)
CUDA
.
@cuda
threads
=
lp
.
bsz
blocks
=
lp
.
rsz
krnl_sfbndfix_new!
(
sp
,
lp
)
...
@@ -668,7 +913,7 @@ function krnl_assign_pf!(f::AbstractArray, p ,lp::SpaceParm, t::Int64)
...
@@ -668,7 +913,7 @@ function krnl_assign_pf!(f::AbstractArray, p ,lp::SpaceParm, t::Int64)
end
end
export
Dw!
,
DwdagDw!
,
g5Dw!
,
pfrandomize!
,
Csw!
,
Dw_new!
,
SF_bndfix!
export
Dw!
,
DwdagDw!
,
g5Dw!
,
pfrandomize!
,
Csw!
,
Dw_new!
,
g5Dw_new!
,
DwdagDw_new!
,
SF_bndfix!
include
(
"DiracIO.jl"
)
include
(
"DiracIO.jl"
)
...
...
src/LatticeGPU.jl
View file @
a8f7442d
...
@@ -57,7 +57,7 @@ export pmul, gpmul, gdagpmul, dmul
...
@@ -57,7 +57,7 @@ export pmul, gpmul, gdagpmul, dmul
include
(
"Dirac/Dirac.jl"
)
include
(
"Dirac/Dirac.jl"
)
using
.
Dirac
using
.
Dirac
export
DiracWorkspace
,
DiracParam
export
DiracWorkspace
,
DiracParam
export
Dw!
,
DwdagDw!
,
pfrandomize!
,
g5Dw!
,
Csw!
,
Dw_new!
,
SF_bndfix!
export
Dw!
,
DwdagDw!
,
pfrandomize!
,
g5Dw!
,
Csw!
,
Dw_new!
,
g5Dw_new!
,
DwdagDw_new!
,
SF_bndfix!
export
read_prop
,
save_prop
,
read_dpar
export
read_prop
,
save_prop
,
read_dpar
export
flw
export
flw
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment