141 lines
3.8 KiB
C++
141 lines
3.8 KiB
C++
// Copyright (c) 2010, Lawrence Livermore National Security, LLC. Produced at
|
|
// the Lawrence Livermore National Laboratory. LLNL-CODE-443211. All Rights
|
|
// reserved. See file COPYRIGHT for details.
|
|
//
|
|
// This file is part of the MFEM library. For more information and source code
|
|
// availability see http://mfem.org.
|
|
//
|
|
// MFEM is free software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU Lesser General Public License (as published by the Free
|
|
// Software Foundation) version 2.1 dated February 1999.
|
|
|
|
#include "../../config/config.hpp"
|
|
#if defined(MFEM_USE_BACKENDS) && defined(MFEM_USE_OCCA)
|
|
|
|
#include "backend.hpp"
|
|
#include "url_handler.hpp"
|
|
#include "bilinearform.hpp"
|
|
#include "../../general/array.hpp"
|
|
|
|
namespace mfem
|
|
{
|
|
|
|
namespace occa
|
|
{
|
|
|
|
bool Engine::fileOpenerRegistered = false;
|
|
|
|
void Engine::Init(const std::string &engine_spec)
|
|
{
|
|
//
|
|
// Initialize inherited fields
|
|
//
|
|
memory_resources[0] = NULL;
|
|
workers_weights[0]= 1.0;
|
|
workers_mem_res[0] = 0;
|
|
|
|
//
|
|
// Initialize the OCCA engine
|
|
//
|
|
::occa::properties props(engine_spec);
|
|
device = new ::occa::device[1];
|
|
device[0].setup(props);
|
|
|
|
okl_path = "mfem-occa://";
|
|
// okl_defines = "...";
|
|
if (!fileOpenerRegistered)
|
|
{
|
|
// The directories from "MFEM_OCCA_OKL_PATH", if any, have the highest
|
|
// priority.
|
|
FileOpener *fo = new FileOpener("mfem-occa://", "MFEM_OCCA_OKL_PATH");
|
|
// Next in priority is the source path, if it exists.
|
|
std::string mfem_src_prefix = mfem::GetSourcePath();
|
|
fo->AddDir(mfem_src_prefix + "/backends/occa");
|
|
// And last in priority is the install path, if it exists.
|
|
std::string mfem_install_prefix = mfem::GetInstallPath();
|
|
fo->AddDir(mfem_install_prefix + "/lib/mfem/occa");
|
|
::occa::io::fileOpener::add(fo);
|
|
fileOpenerRegistered = true;
|
|
}
|
|
}
|
|
|
|
Engine::Engine(const std::string &engine_spec)
|
|
: mfem::Engine(NULL, 1, 1)
|
|
{
|
|
Init(engine_spec);
|
|
}
|
|
|
|
#ifdef MFEM_USE_MPI
|
|
Engine::Engine(MPI_Comm _comm, const std::string &engine_spec)
|
|
: mfem::Engine(NULL, 1, 1)
|
|
{
|
|
comm = _comm;
|
|
Init(engine_spec);
|
|
}
|
|
#endif
|
|
|
|
DLayout Engine::MakeLayout(std::size_t size) const
|
|
{
|
|
return DLayout(new Layout(*this, size));
|
|
}
|
|
|
|
DLayout Engine::MakeLayout(const mfem::Array<std::size_t> &offsets) const
|
|
{
|
|
MFEM_ASSERT(offsets.Size() == 2,
|
|
"multiple workers are not supported yet");
|
|
return DLayout(new Layout(*this, offsets.Last()));
|
|
}
|
|
|
|
DArray Engine::MakeArray(PLayout &layout, std::size_t item_size) const
|
|
{
|
|
MFEM_ASSERT(dynamic_cast<Layout *>(&layout) != NULL,
|
|
"invalid input layout");
|
|
Layout *lt = static_cast<Layout *>(&layout);
|
|
return DArray(new Array(*lt, item_size));
|
|
}
|
|
|
|
DVector Engine::MakeVector(PLayout &layout, int type_id) const
|
|
{
|
|
MFEM_ASSERT(type_id == ScalarId<double>::value, "invalid type_id");
|
|
MFEM_ASSERT(dynamic_cast<Layout *>(&layout) != NULL,
|
|
"invalid input layout");
|
|
Layout *lt = static_cast<Layout *>(&layout);
|
|
return DVector(new Vector(*lt));
|
|
}
|
|
|
|
DFiniteElementSpace Engine::MakeFESpace(mfem::FiniteElementSpace &fespace) const
|
|
{
|
|
return DFiniteElementSpace(new FiniteElementSpace(*this, fespace));
|
|
}
|
|
|
|
DBilinearForm Engine::MakeBilinearForm(mfem::BilinearForm &bf) const
|
|
{
|
|
return DBilinearForm(new BilinearForm(*this, bf));
|
|
}
|
|
|
|
void Engine::AssembleLinearForm(LinearForm &l_form) const
|
|
{
|
|
/// FIXME - What will the actual parameters be?
|
|
MFEM_ABORT("FIXME");
|
|
}
|
|
|
|
mfem::Operator *Engine::MakeOperator(const MixedBilinearForm &mbl_form) const
|
|
{
|
|
/// FIXME - What will the actual parameters be?
|
|
MFEM_ABORT("FIXME");
|
|
return NULL;
|
|
}
|
|
|
|
mfem::Operator *Engine::MakeOperator(const NonlinearForm &nl_form) const
|
|
{
|
|
/// FIXME - What will the actual parameters be?
|
|
MFEM_ABORT("FIXME");
|
|
return NULL;
|
|
}
|
|
|
|
} // namespace mfem::occa
|
|
|
|
} // namespace mfem
|
|
|
|
#endif // defined(MFEM_USE_BACKENDS) && defined(MFEM_USE_OCCA)
|