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