# How to create a single precision copy of double precision matrix A?

Hello,

I need a single precision copy of the double precision matrix A (in addition to the double precision one!) in the cusp library.

How can I create such a copy of A called A_sp in the code below?

/*

• Copyright 2008-2009 NVIDIA Corporation
• Licensed under the Apache License, Version 2.0 (the “License”);
• you may not use this file except in compliance with the License.
• You may obtain a copy of the License at
• `````` http://www.apache.org/licenses/LICENSE-2.0
``````
• Unless required by applicable law or agreed to in writing, software
• distributed under the License is distributed on an “AS IS” BASIS,
• WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
• See the License for the specific language governing permissions and
• limitations under the License.
*/

#include
#include
#include
#include
#include

namespace blas = cusp::blas;

namespace cusp
{
namespace krylov
{

template
void cg(LinearOperator& A,
Vector& x,
Vector& b)
{
typedef typename LinearOperator::value_type ValueType;

``````cusp::default_monitor monitor(b);

cusp::krylov::cg(A, x, b, monitor);
``````

}

template
void cg(LinearOperator& A,
Vector& x,
Vector& b,
Monitor& monitor)
{
typedef typename LinearOperator::value_type ValueType;
typedef typename LinearOperator::memory_space MemorySpace;

``````cusp::identity_operator M(A.num_rows, A.num_cols);

cusp::krylov::cg(A, x, b, monitor, M);
``````

}

template
void cg(LinearOperator& A,
Vector& x,
Vector& b,
Monitor& monitor,
Preconditioner& M)
{
CUSP_PROFILE_SCOPED();

``````typedef typename LinearOperator::value_type   ValueType;
typedef typename LinearOperator::memory_space MemorySpace;

assert(A.num_rows == A.num_cols);        // sanity check

const size_t N = A.num_rows;

// allocate workspace
cusp::array1d y(N);
cusp::array1d z(N);
cusp::array1d r(N);
cusp::array1d p(N);

// y``````

[code]/*

• Copyright 2008-2009 NVIDIA Corporation
• Licensed under the Apache License, Version 2.0 (the “License”);
• you may not use this file except in compliance with the License.
• You may obtain a copy of the License at
• `````` http://www.apache.org/licenses/LICENSE-2.0
``````
• Unless required by applicable law or agreed to in writing, software
• distributed under the License is distributed on an “AS IS” BASIS,
• WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
• See the License for the specific language governing permissions and
• limitations under the License.
*/

#include
#include
#include
#include
#include

namespace blas = cusp::blas;

namespace cusp
{
namespace krylov
{

template
void cg(LinearOperator& A,
Vector& x,
Vector& b)
{
typedef typename LinearOperator::value_type ValueType;

``````cusp::default_monitor monitor(b);

cusp::krylov::cg(A, x, b, monitor);
``````

}

template
void cg(LinearOperator& A,
Vector& x,
Vector& b,
Monitor& monitor)
{
typedef typename LinearOperator::value_type ValueType;
typedef typename LinearOperator::memory_space MemorySpace;

``````cusp::identity_operator M(A.num_rows, A.num_cols);

cusp::krylov::cg(A, x, b, monitor, M);
``````

}

template
void cg(LinearOperator& A,
Vector& x,
Vector& b,
Monitor& monitor,
Preconditioner& M)
{
CUSP_PROFILE_SCOPED();

``````typedef typename LinearOperator::value_type   ValueType;
typedef typename LinearOperator::memory_space MemorySpace;

assert(A.num_rows == A.num_cols);        // sanity check

const size_t N = A.num_rows;

// allocate workspace
cusp::array1d y(N);
cusp::array1d z(N);
cusp::array1d r(N);
cusp::array1d p(N);

// y``````