MFEM v4.8.0
Finite element discretization library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Pages
plinearform.cpp
Go to the documentation of this file.
1// Copyright (c) 2010-2025, Lawrence Livermore National Security, LLC. Produced
2// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
3// LICENSE and NOTICE for details. LLNL-CODE-806117.
4//
5// This file is part of the MFEM library. For more information and source code
6// availability visit https://mfem.org.
7//
8// MFEM is free software; you can redistribute it and/or modify it under the
9// terms of the BSD-3 license. We welcome feedback and contributions, see file
10// CONTRIBUTING.md for details.
11
12#include "../config/config.hpp"
13
14#ifdef MFEM_USE_MPI
15
16#include "fem.hpp"
17
18namespace mfem
19{
20
22{
23 if (pf) { pfes = pf; }
25}
26
28{
29 pfes = pf;
30 LinearForm::Update(pf,v,v_offset);
31}
32
34{
35 LinearForm::MakeRef(f, v, v_offset);
36 pfes = dynamic_cast<ParFiniteElementSpace*>(f);
37 MFEM_ASSERT(pfes != NULL, "not a ParFiniteElementSpace");
38}
39
41{
42 LinearForm::MakeRef(pf, v, v_offset);
43 pfes = pf;
44}
45
56
58{
59 bool parallel;
60 bool local = LinearForm::SupportsDevice();
61 MPI_Allreduce(&local, &parallel, 1, MFEM_MPI_CXX_BOOL, MPI_LAND,
62 pfes->GetComm());
63 return parallel;
64}
65
67{
68 Array<int> vdofs;
69 Vector elemvect;
70
71 if (interior_face_integs.Size())
72 {
73 ParMesh *pmesh = pfes->GetParMesh();
74 for (int k = 0; k < interior_face_integs.Size(); k++)
75 {
76 for (int i = 0; i < pmesh->GetNSharedFaces(); i++)
77 {
79 tr = pmesh->GetSharedFaceTransformations(i);
80
81 if (tr != NULL)
82 {
83 int Elem2Nbr = tr->Elem2No - pmesh->GetNE();
84 fes -> GetElementVDofs (tr -> Elem1No, vdofs);
86 AssembleRHSElementVect(*fes->GetFE(tr->Elem1No),
87 *pfes->GetFaceNbrFE(Elem2Nbr),
88 *tr, elemvect);
89 AddElementVector (vdofs, elemvect);
90 }
91 }
92 }
93 }
94}
95
97{
98 const Operator* prolong = pfes->GetProlongationMatrix();
99 prolong->MultTranspose(*this, tv);
100}
101
103{
105 const Operator* prolong = pfes->GetProlongationMatrix();
106 prolong->MultTranspose(*this, *tv);
107 return tv;
108}
109
110}
111
112#endif
A specialized ElementTransformation class representing a face and its two neighboring elements.
Definition eltrans.hpp:750
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
Definition fespace.hpp:244
virtual const FiniteElement * GetFE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th element in t...
Definition fespace.cpp:3835
Wrapper for hypre's parallel vector class.
Definition hypre.hpp:219
virtual void MakeRef(FiniteElementSpace *f, Vector &v, int v_offset)
Make the LinearForm reference external data on a new FiniteElementSpace.
virtual bool SupportsDevice() const
Return true if assembly on device is supported, false otherwise.
FiniteElementSpace * fes
FE space on which the LinearForm lives. Not owned.
Array< LinearFormIntegrator * > interior_face_integs
Set of Internal Face Integrators to be applied.
void Update()
Update the object according to the associated FE space fes.
void Assemble()
Assembles the linear form i.e. sums over all domain/bdr integrators.
int GetNE() const
Returns number of elements.
Definition mesh.hpp:1282
Abstract operator.
Definition operator.hpp:25
virtual void MultTranspose(const Vector &x, Vector &y) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
Definition operator.hpp:93
Abstract parallel finite element space.
Definition pfespace.hpp:29
MPI_Comm GetComm() const
Definition pfespace.hpp:334
HypreParVector * NewTrueDofVector()
Definition pfespace.hpp:398
const FiniteElement * GetFaceNbrFE(int i, int ndofs=0) const
const Operator * GetProlongationMatrix() const override
ParMesh * GetParMesh() const
Definition pfespace.hpp:338
bool SupportsDevice() const override
Return true if assembly on device is supported, false otherwise.
HypreParVector * ParallelAssemble()
Returns the vector assembled on the true dofs, i.e. P^t v.
ParFiniteElementSpace * pfes
Points to the same object as fes.
void Assemble()
Assembles the ParLinearForm i.e. sums over all domain/bdr integrators.
void MakeRef(FiniteElementSpace *f, Vector &v, int v_offset) override
Make the ParLinearForm reference external data on a new FiniteElementSpace.
Class for parallel meshes.
Definition pmesh.hpp:34
int GetNSharedFaces() const
Return the number of shared faces (3D), edges (2D), vertices (1D)
Definition pmesh.cpp:3152
FaceElementTransformations * GetSharedFaceTransformations(int sf, bool fill2=true)
Get the FaceElementTransformations for the given shared face (edge 2D) using the shared face index sf...
Definition pmesh.cpp:2922
Vector data type.
Definition vector.hpp:82
void AddElementVector(const Array< int > &dofs, const Vector &elemvect)
Add elements of the elemvect Vector to the entries listed in dofs. Negative dof values cause the -dof...
Definition vector.cpp:745
std::function< real_t(const Vector &)> f(real_t mass_coeff)
Definition lor_mms.hpp:30