Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
d2365200
"vscode:/vscode.git/clone" did not exist on "183550944180dd31b205f98a6e37769f813ec5e3"
Commit
d2365200
authored
Jun 17, 2011
by
Mark Friedrichs
Browse files
Update to files corruptedd in r2814
parent
a2674e83
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
407 additions
and
38 deletions
+407
-38
openmmapi/include/openmm/GBVIForce.h
openmmapi/include/openmm/GBVIForce.h
+284
-19
openmmapi/src/GBVIForce.cpp
openmmapi/src/GBVIForce.cpp
+123
-19
No files found.
openmmapi/include/openmm/GBVIForce.h
View file @
d2365200
Vim:
Warning:
Output
is
not
to
a
terminal
[
?
1049
h
[
?
1
h
=
[
1
;
59
r
[
?
12
;
25
h
[
?
12l
[
?
25
h
[
27
m
[
m
[
H
[
2
J
[
?
25l
[
59
;
1
H
"svn-commit.tmp"
15L
,
601
C
[
1
;
1
H
[
33
m
1
2
[
m
[
32
m
--
This
line
,
and
those
below
,
will
be
ignored
--
[
m
[
33
m
3
4
[
m
[
1
m
[
35
mM
plugins
/
amoeba
/
platforms
/
cuda
/
src
/
AmoebaCudaKernelFactory
.
cpp
[
m
[
33
m
5
[
m
[
1
m
[
35
mM
plugins
/
freeEnergy
/
platforms
/
reference
/
src
/
gbsa
/
CpuGBVISoftcore
.
cpp
[
m
[
33
m
6
[
m
[
1
m
[
35
mM
openmmapi
/
include
/
openmm
/
GBVIForce
.
h
[
m
[
33
m
7
[
m
[
1
m
[
35
mM
openmmapi
/
src
/
GBVIForce
.
cpp
[
m
[
33
m
8
[
m
[
1
m
[
35
mM
olla
/
src
/
Platform
.
cpp
[
m
[
33
m
9
[
m
[
1
m
[
35
mM
platforms
/
opencl
/
src
/
OpenCLContext
.
h
[
m
[
33
m
10
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
CudaKernels
.
cpp
[
m
[
33
m
11
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
kCalculateGBVIBornSum
.
cu
[
m
[
33
m
12
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
gputypes
.
h
[
m
[
33
m
13
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
cudatypes
.
h
[
m
[
33
m
14
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
kForces
.
cu
[
m
[
33
m
15
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
gpu
.
cpp
[
m
[
1
m
[
34
m
~
[
17
;
1
H
~
[
18
;
1
H
~
[
19
;
1
H
~
[
20
;
1
H
~
[
21
;
1
H
~
[
22
;
1
H
~
[
23
;
1
H
~
[
24
;
1
H
~
[
25
;
1
H
~
[
26
;
1
H
~
[
27
;
1
H
~
[
28
;
1
H
~
[
29
;
1
H
~
[
30
;
1
H
~
[
31
;
1
H
~
[
32
;
1
H
~
[
33
;
1
H
~
[
34
;
1
H
~
[
35
;
1
H
~
[
36
;
1
H
~
[
37
;
1
H
~
[
38
;
1
H
~
[
39
;
1
H
~
[
40
;
1
H
~
[
41
;
1
H
~
[
42
;
1
H
~
[
43
;
1
H
~
[
44
;
1
H
~
[
45
;
1
H
~
[
46
;
1
H
~
[
47
;
1
H
~
[
48
;
1
H
~
[
49
;
1
H
~
[
50
;
1
H
~
[
51
;
1
H
~
[
52
;
1
H
~
[
53
;
1
H
~
[
54
;
1
H
~
[
55
;
1
H
~
[
56
;
1
H
~
[
57
;
1
H
~
[
58
;
1
H
~
[
m
[
59
;
217
H1
,
0
-
1
[
9
CAll
[
1
;
5
H
[
?
12l
[
?
25
h
[
?
25l
[
59
;
1
H
[
K
[
59
;
1
H
:
[
?
12l
[
?
25
hq
!
[
?
25l
[
59
;
1
H
[
K
[
59
;
1
H
[
?
1l
>
[
?
12l
[
?
25
h
[
?
1049l
Log
message
unchanged
or
not
specified
a
)
bort
,
c
)
ontinue
,
e
)
dit
#ifndef OPENMM_GBVIFORCEFIELD_H_
#define OPENMM_GBVIFORCEFIELD_H_
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2008-2009 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
#include "Force.h"
#include <vector>
#include "internal/windowsExport.h"
namespace
OpenMM
{
/**
* This class implements an implicit solvation force using the GB/VI model.
* <p>
* To use this class, create a GBVIForce object, then call addParticle() once for each particle in the
* System to define its parameters. The number of particles for which you define GB/VI parameters must
* be exactly equal to the number of particles in the System, or else an exception will be thrown when you
* try to create a Context. After a particle has been added, you can modify its force field parameters
* by calling setParticleParameters().
*/
class
OPENMM_EXPORT
GBVIForce
:
public
Force
{
public:
/**
* This is an enumeration of the different methods that may be used for handling long range nonbonded forces.
*/
enum
NonbondedMethod
{
/**
* No cutoff is applied to nonbonded interactions. The full set of N^2 interactions is computed exactly.
* This necessarily means that periodic boundary conditions cannot be used. This is the default.
*/
NoCutoff
=
0
,
/**
* Interactions beyond the cutoff distance are ignored.
*/
CutoffNonPeriodic
=
1
,
/**
* Periodic boundary conditions are used, so that each particle interacts only with the nearest periodic copy of
* each other particle. Interactions beyond the cutoff distance are ignored.
*/
CutoffPeriodic
=
2
,
};
/**
* This is an enumeration of the different methods that may be used for scaling of the Born radii.
*/
enum
BornRadiusScalingMethod
{
/**
* No scaling method is applied.
*/
NoScaling
=
0
,
/**
* Use the method outlined in Proteins 55, 383-394 (2004), Eq. 6
*/
Tanh
=
1
,
/**
* Use quintic spline scaling function
*/
QuinticSpline
=
2
};
/*
* Create a GBVIForce.
*/
GBVIForce
();
/**
* Get the number of particles in the system.
*/
int
getNumParticles
()
const
{
return
particles
.
size
();
}
/**
* Add the GB/VI parameters for a particle. This should be called once for each particle
* in the System. When it is called for the i'th time, it specifies the parameters for the i'th particle.
*
* @param charge the charge of the particle, measured in units of the proton charge
* @param radius the GB/VI radius of the particle, measured in nm
* @param gamma the gamma parameter
* @return the index of the particle that was added
*/
int
addParticle
(
double
charge
,
double
radius
,
double
gamma
);
/**
* Get the force field parameters for a particle.
*
* @param index the index of the particle for which to get parameters
* @param charge the charge of the particle, measured in units of the proton charge
* @param radius the GBSA radius of the particle, measured in nm
* @param gamma the gamma parameter
*/
void
getParticleParameters
(
int
index
,
double
&
charge
,
double
&
radius
,
double
&
gamma
)
const
;
/**
* Set the force field parameters for a particle.
*
* @param index the index of the particle for which to set parameters
* @param charge the charge of the particle, measured in units of the proton charge
* @param radius the GB/VI radius of the particle, measured in nm
* @param gamma the gamma parameter
*/
void
setParticleParameters
(
int
index
,
double
charge
,
double
radius
,
double
gamma
);
/**
* Add a bond
*
* @param particle1 the index of the first particle
* @param particle2 the index of the second particle
* @param distance the distance between the two particles, measured in nm
* @return the index of the bond that was added
*/
int
addBond
(
int
particle1
,
int
particle2
,
double
distance
);
/**
* Get the parameters defining a bond
*
* @param index the index of the bond for which to get parameters
* @param particle1 the index of the first particle involved in the bond
* @param particle2 the index of the second particle involved in the bond
* @param distance the distance between the two particles, measured in nm
*/
void
getBondParameters
(
int
index
,
int
&
particle1
,
int
&
particle2
,
double
&
distance
)
const
;
/**
* Set 1-2 bonds
*
* @param index index of the bond for which to set parameters
* @param particle1 index of first atom in bond
* @param particle2 index of second atom in bond
* @param bondLength bond length
*/
void
setBondParameters
(
int
index
,
int
particle1
,
int
particle2
,
double
bondLength
);
/**
* Get number of bonds
*
* @return number of bonds
*/
int
getNumBonds
(
void
)
const
;
/**
* Get the dielectric constant for the solvent.
*/
double
getSolventDielectric
()
const
{
return
solventDielectric
;
}
/**
* Set the dielectric constant for the solvent.
*/
void
setSolventDielectric
(
double
dielectric
)
{
solventDielectric
=
dielectric
;
}
/**
* Get the dielectric constant for the solute.
*/
double
getSoluteDielectric
()
const
{
return
soluteDielectric
;
}
/**
* Set the dielectric constant for the solute.
*/
void
setSoluteDielectric
(
double
dielectric
)
{
soluteDielectric
=
dielectric
;
}
/**
* Get the method used for handling long range nonbonded interactions.
*/
NonbondedMethod
getNonbondedMethod
()
const
;
/**
* Set the method used for handling long range nonbonded interactions.
*/
void
setNonbondedMethod
(
NonbondedMethod
method
);
/**
* Get the cutoff distance (in nm) being used for nonbonded interactions. If the NonbondedMethod in use
* is NoCutoff, this value will have no effect.
*
* @return the cutoff distance, measured in nm
*/
double
getCutoffDistance
()
const
;
/**
* Set the cutoff distance (in nm) being used for nonbonded interactions. If the NonbondedMethod in use
* is NoCutoff, this value will have no effect.
*
* @param distance the cutoff distance, measured in nm
*/
void
setCutoffDistance
(
double
distance
);
/**
* Get Born radius scalling method
*/
GBVIForce
::
BornRadiusScalingMethod
getBornRadiusScalingMethod
(
void
)
const
;
/**
* Set Born radius scalling method
*/
void
setBornRadiusScalingMethod
(
BornRadiusScalingMethod
method
);
/**
* Get the lower limit factor used in the quintic spline scaling method (typically 0.5-0.8)
*/
double
getQuinticLowerLimitFactor
(
void
)
const
;
/**
* Set the lower limit factor used in the quintic spline scaling method (typically 0.5-0.8)
*/
void
setQuinticLowerLimitFactor
(
double
quinticLowerLimitFactor
);
/**
* Get the upper limit used in the quintic spline scaling method (typically 0.5-0.8)
*/
double
getQuinticUpperBornRadiusLimit
(
void
)
const
;
/**
* Set the upper limit used in the quintic spline scaling method (typically 0.008)
*/
void
setQuinticUpperBornRadiusLimit
(
double
quinticUpperBornRadiusLimit
);
protected:
ForceImpl
*
createImpl
();
private:
class
ParticleInfo
;
NonbondedMethod
nonbondedMethod
;
double
cutoffDistance
,
solventDielectric
,
soluteDielectric
;
BornRadiusScalingMethod
scalingMethod
;
double
quinticLowerLimitFactor
,
quinticUpperBornRadiusLimit
;
class
BondInfo
;
std
::
vector
<
ParticleInfo
>
particles
;
std
::
vector
<
BondInfo
>
bonds
;
};
/**
* This is an internal class used to record information about a particle.
* @private
*/
class
GBVIForce
::
ParticleInfo
{
public:
double
charge
,
radius
,
gamma
;
ParticleInfo
()
{
charge
=
radius
=
gamma
=
0.0
;
}
ParticleInfo
(
double
charge
,
double
radius
,
double
gamma
)
:
charge
(
charge
),
radius
(
radius
),
gamma
(
gamma
)
{
}
};
/**
* This is an internal class used to record information about a bond.
* @private
*/
class
GBVIForce
::
BondInfo
{
public:
int
particle1
,
particle2
;
double
bondLength
;
BondInfo
()
{
bondLength
=
0.0
;
particle1
=
-
1
;
particle2
=
-
1
;
}
BondInfo
(
int
atomIndex1
,
int
atomIndex2
,
double
bondLength
)
:
particle1
(
atomIndex1
),
particle2
(
atomIndex2
),
bondLength
(
bondLength
)
{
}
};
}
// namespace OpenMM
#endif
/*OPENMM_GBVIFORCEFIELD_H_*/
openmmapi/src/GBVIForce.cpp
View file @
d2365200
Vim:
Warning:
Output
is
not
to
a
terminal
[
?
1049h
[
?
1h
=
[
1
;
59
r
[
?
12
;
25h
[
?
12l
[
?
25h
[
27
m
[
m
[
H
[
2
J
[
?
25l
[
59
;
1
H
"svn-commit.tmp"
15L
,
601
C
[
1
;
1
H
[
33
m
1
2
[
m
[
32
m
--
This
line
,
and
those
below
,
will
be
ignored
--
[
m
[
33
m
3
4
[
m
[
1
m
[
35
mM
plugins
/
amoeba
/
platforms
/
cuda
/
src
/
AmoebaCudaKernelFactory
.
cpp
[
m
[
33
m
5
[
m
[
1
m
[
35
mM
plugins
/
freeEnergy
/
platforms
/
reference
/
src
/
gbsa
/
CpuGBVISoftcore
.
cpp
[
m
[
33
m
6
[
m
[
1
m
[
35
mM
openmmapi
/
include
/
openmm
/
GBVIForce
.
h
[
m
[
33
m
7
[
m
[
1
m
[
35
mM
openmmapi
/
src
/
GBVIForce
.
cpp
[
m
[
33
m
8
[
m
[
1
m
[
35
mM
olla
/
src
/
Platform
.
cpp
[
m
[
33
m
9
[
m
[
1
m
[
35
mM
platforms
/
opencl
/
src
/
OpenCLContext
.
h
[
m
[
33
m
10
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
CudaKernels
.
cpp
[
m
[
33
m
11
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
kCalculateGBVIBornSum
.
cu
[
m
[
33
m
12
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
gputypes
.
h
[
m
[
33
m
13
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
cudatypes
.
h
[
m
[
33
m
14
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
kForces
.
cu
[
m
[
33
m
15
[
m
[
1
m
[
35
mM
platforms
/
cuda
/
src
/
kernels
/
gpu
.
cpp
[
m
[
1
m
[
34
m
~
[
17
;
1
H
~
[
18
;
1
H
~
[
19
;
1
H
~
[
20
;
1
H
~
[
21
;
1
H
~
[
22
;
1
H
~
[
23
;
1
H
~
[
24
;
1
H
~
[
25
;
1
H
~
[
26
;
1
H
~
[
27
;
1
H
~
[
28
;
1
H
~
[
29
;
1
H
~
[
30
;
1
H
~
[
31
;
1
H
~
[
32
;
1
H
~
[
33
;
1
H
~
[
34
;
1
H
~
[
35
;
1
H
~
[
36
;
1
H
~
[
37
;
1
H
~
[
38
;
1
H
~
[
39
;
1
H
~
[
40
;
1
H
~
[
41
;
1
H
~
[
42
;
1
H
~
[
43
;
1
H
~
[
44
;
1
H
~
[
45
;
1
H
~
[
46
;
1
H
~
[
47
;
1
H
~
[
48
;
1
H
~
[
49
;
1
H
~
[
50
;
1
H
~
[
51
;
1
H
~
[
52
;
1
H
~
[
53
;
1
H
~
[
54
;
1
H
~
[
55
;
1
H
~
[
56
;
1
H
~
[
57
;
1
H
~
[
58
;
1
H
~
[
m
[
59
;
217
H1
,
0
-
1
[
9
CAll
[
1
;
5
H
[
?
12l
[
?
25h
[
?
25l
[
59
;
1
H
[
K
[
59
;
1
H
:
[
?
12l
[
?
25h
q
!
[
?
25l
[
59
;
1
H
[
K
[
59
;
1
H
[
?
1l
>
[
?
12l
[
?
25h
[
?
1049l
Log
message
unchanged
or
not
specified
a
)
bort
,
c
)
ontinue
,
e
)
dit
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2008-2009 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
#include "openmm/Force.h"
#include "openmm/OpenMMException.h"
#include "openmm/GBVIForce.h"
#include "openmm/internal/GBVIForceImpl.h"
#include <sstream>
using
namespace
OpenMM
;
GBVIForce
::
GBVIForce
()
:
nonbondedMethod
(
NoCutoff
),
cutoffDistance
(
1.0
),
solventDielectric
(
78.3
),
soluteDielectric
(
1.0
)
{
}
int
GBVIForce
::
addParticle
(
double
charge
,
double
radius
,
double
gamma
)
{
particles
.
push_back
(
ParticleInfo
(
charge
,
radius
,
gamma
));
return
particles
.
size
()
-
1
;
}
void
GBVIForce
::
getParticleParameters
(
int
index
,
double
&
charge
,
double
&
radius
,
double
&
gamma
)
const
{
charge
=
particles
[
index
].
charge
;
radius
=
particles
[
index
].
radius
;
gamma
=
particles
[
index
].
gamma
;
}
void
GBVIForce
::
setParticleParameters
(
int
index
,
double
charge
,
double
radius
,
double
gamma
)
{
particles
[
index
].
charge
=
charge
;
particles
[
index
].
radius
=
radius
;
particles
[
index
].
gamma
=
gamma
;
}
GBVIForce
::
NonbondedMethod
GBVIForce
::
getNonbondedMethod
()
const
{
return
nonbondedMethod
;
}
void
GBVIForce
::
setNonbondedMethod
(
NonbondedMethod
method
)
{
nonbondedMethod
=
method
;
}
double
GBVIForce
::
getCutoffDistance
()
const
{
return
cutoffDistance
;
}
void
GBVIForce
::
setCutoffDistance
(
double
distance
)
{
cutoffDistance
=
distance
;
}
GBVIForce
::
BornRadiusScalingMethod
GBVIForce
::
getBornRadiusScalingMethod
(
void
)
const
{
return
scalingMethod
;
}
void
GBVIForce
::
setBornRadiusScalingMethod
(
BornRadiusScalingMethod
method
)
{
scalingMethod
=
method
;
}
double
GBVIForce
::
getQuinticLowerLimitFactor
(
void
)
const
{
return
quinticLowerLimitFactor
;
}
void
GBVIForce
::
setQuinticLowerLimitFactor
(
double
inputQuinticLowerLimitFactor
){
quinticLowerLimitFactor
=
inputQuinticLowerLimitFactor
;
}
double
GBVIForce
::
getQuinticUpperBornRadiusLimit
(
void
)
const
{
return
quinticUpperBornRadiusLimit
;
}
void
GBVIForce
::
setQuinticUpperBornRadiusLimit
(
double
inputQuinticUpperBornRadiusLimit
){
quinticUpperBornRadiusLimit
=
inputQuinticUpperBornRadiusLimit
;
}
int
GBVIForce
::
addBond
(
int
particle1
,
int
particle2
,
double
bondLength
)
{
bonds
.
push_back
(
BondInfo
(
particle1
,
particle2
,
bondLength
));
return
bonds
.
size
()
-
1
;
}
void
GBVIForce
::
setBondParameters
(
int
index
,
int
particle1
,
int
particle2
,
double
bondLength
)
{
bonds
[
index
].
particle1
=
particle1
;
bonds
[
index
].
particle2
=
particle2
;
bonds
[
index
].
bondLength
=
bondLength
;
}
int
GBVIForce
::
getNumBonds
(
void
)
const
{
return
(
int
)
bonds
.
size
();
}
void
GBVIForce
::
getBondParameters
(
int
index
,
int
&
bondIndex1
,
int
&
bondIndex2
,
double
&
bondLength
)
const
{
bondIndex1
=
bonds
[
index
].
particle1
;
bondIndex2
=
bonds
[
index
].
particle2
;
bondLength
=
bonds
[
index
].
bondLength
;
}
ForceImpl
*
GBVIForce
::
createImpl
()
{
return
new
GBVIForceImpl
(
*
this
);
}
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