Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Stix miniapp in 2D #4222

Open
wants to merge 117 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
10abb8c
Adding first draft of truly 2D version of stix miniapp
mlstowell Jun 2, 2021
78baf18
Implementing ProjectMatrixCoefficient in restricted ND and RT finite …
mlstowell Jun 2, 2021
4576fd1
make style
mlstowell Jun 2, 2021
c65df64
Instantiating restricted ND and RT spaces when appropriate
mlstowell Jun 2, 2021
0f5a94e
Removing extruded meshes from main application
mlstowell Jun 2, 2021
2235be5
Moving the complex phase coefficient
mlstowell Jun 15, 2021
b6c8138
make style
mlstowell Jun 15, 2021
135437c
Adding plasma subdir to makefile
mlstowell Jun 15, 2021
2e31d29
Fixing assert
mlstowell Jun 15, 2021
1a2c85d
Merge remote-tracking branch 'origin/lo-dim-em-dev' into stix-r2d-dev
mlstowell Jun 15, 2021
94326d8
Merge remote-tracking branch 'origin/lo-dim-em-dev' into stix-r2d-dev
mlstowell Jun 29, 2021
5a1c964
Updating copyright statements
mlstowell Jun 29, 2021
d5d3f39
Adding serial L2FESpace to miniapps/common
mlstowell Jul 2, 2021
7117895
make style
mlstowell Jul 2, 2021
b66491a
Visualizing R2D fields using extruded 3D mesh
mlstowell Jul 2, 2021
d8987d1
Bug fixes in ND_R2D_SegmentElement
mlstowell Aug 5, 2021
c43292b
Extending cold plasma classes to support 2D
mlstowell Aug 5, 2021
66ed04d
Merge remote-tracking branch 'origin/lo-dim-em-dev' into stix-r2d-dev
mlstowell Aug 5, 2021
ed095f0
make style
mlstowell Aug 5, 2021
81bf6b2
Changes from dh-sheath-bc-dev
mlstowell Oct 3, 2021
8eaa4b5
Initial cylindrical symmetry modifications
mlstowell Oct 3, 2021
35e02f0
Recording the command line in a special file
mlstowell Oct 4, 2021
18ecbca
Adding choice of direction to pedestal profile
mlstowell Oct 4, 2021
ff2b31a
Merge remote-tracking branch 'origin/lo-dim-em-dev' into stix-r2d-dev
mlstowell Oct 5, 2021
f79e2a2
make style
mlstowell Oct 5, 2021
925ecda
Applying k-vector phase shift to Dirichlet BCs
mlstowell Oct 22, 2021
4de68f6
Adding multi-strap antenna source function
mlstowell Oct 22, 2021
f16740e
Adding ZMUMPS support from @psocratis
mlstowell Nov 1, 2021
681c33e
Adding MUMPS solver to CPDSolverDH
mlstowell Nov 1, 2021
2b06ae0
Expanding linear interpolator unit tests to include R2D classes
mlstowell Nov 1, 2021
5259381
Adding ComplexPhaseCoefficient
mlstowell Nov 1, 2021
63dab30
Removing sinkx and coskx in favor of ComplexPhaseCoefficient
mlstowell Nov 1, 2021
0584242
Generalizing MultiStrapAntennaH
mlstowell Nov 1, 2021
03e39e3
Expanding solver type enum to include MUMPS
mlstowell Nov 1, 2021
e5d6a82
Bugfix
mlstowell Nov 8, 2021
d374c13
Adding boundary integrator for ND_R2D basis
mlstowell Nov 20, 2021
2f370aa
Adding VectorR2DCoef to aid in visualizing R2D bases
mlstowell Nov 20, 2021
e65bcf2
Adding to BFieldProfile
mlstowell Nov 20, 2021
9e11106
Fixing phases of source terms in DH formulation
mlstowell Nov 20, 2021
c5d6ffc
Adding test meshes and use of BFieldProfile
mlstowell Nov 20, 2021
8139669
Renaming EB formulation solver files
mlstowell Nov 20, 2021
bae4667
Separating StixBC class into its own files
mlstowell Nov 20, 2021
e9fe6cb
Adding stix_r2d_eb
mlstowell Nov 20, 2021
77e28ea
Adding new files to makefile
mlstowell Nov 20, 2021
ac976ce
Adding volumetric current source to container object for BCs
mlstowell Jan 6, 2022
a07dd33
Adding region restricted integrators to ParComplexLinearForm
mlstowell Jan 6, 2022
01001e4
Adding matrix coefficients to mimic cylindrical symmetry in the Maxwe…
mlstowell Jan 6, 2022
64995fb
Splitting implementation of the Maxwell equations into logical pieces…
mlstowell Jan 6, 2022
c92a828
Adding Christina's collisional profile to stix_r2d_eb
mlstowell Jan 15, 2022
a1a46a2
Adding Lp error estimator for complex valued fields
mlstowell Feb 7, 2022
ec33012
Adding axis of cylindrically symmetric domains to StixBCs class
mlstowell Feb 7, 2022
feaca8f
Adding coefficient class for the Stix L coefficient
mlstowell Feb 7, 2022
ffb80ab
Adding coefficient profiles for WHAM initial simulations
mlstowell Feb 7, 2022
e41ed68
Using AMR to prepare initial mesh based on error in L
mlstowell Feb 7, 2022
d116aa9
Enforcing E_phi=0 on axis of cylindrical symmetry
mlstowell Feb 7, 2022
1f7a871
Initial changes to support AMR based on E field calculation
mlstowell Feb 7, 2022
9213acd
make style
mlstowell Feb 7, 2022
9ed60b5
Improving preparation of vector fields for visualization
mlstowell Feb 7, 2022
92ef9ae
Adding support for pseudovector visualization with cylindrical symmetry
mlstowell Feb 9, 2022
f0af916
Visualizing DivB and DivD pseudoscalars
mlstowell Feb 9, 2022
4af5618
Merge remote-tracking branch 'origin/master' into stix-r2d-dev
mlstowell Mar 2, 2022
5ae9376
Adding second draft of stix_r2d_dh
mlstowell Mar 6, 2022
a2776a5
Adjusting include directive to avoid build issue
mlstowell Mar 9, 2022
6101c04
Adding VisObject for boundary coefficients
mlstowell Mar 9, 2022
411bebd
Fixing ND_R2D_Segment CalcPhys* methods
mlstowell Mar 9, 2022
42e2d91
Switching from xposition to nu following stix2d_dh
mlstowell Mar 9, 2022
58b3ee6
make style
mlstowell Mar 9, 2022
c25c450
Experimenting with sheath BC in stix_r2d_dh
mlstowell Mar 9, 2022
17447a6
Merge remote-tracking branch 'origin/master' into stix-r2d-dev
mlstowell Mar 14, 2022
f233e06
Adding preconditioner to Sheath BC solve
mlstowell Mar 17, 2022
636fcc0
Fixing uninitialized variables in GMRES solver
mlstowell Mar 17, 2022
6c503b9
Small fixes in stix_r2d_dh
mlstowell Mar 17, 2022
21fb181
Merge remote-tracking branch 'origin/master' into stix-r2d-dev
mlstowell Mar 21, 2022
d8ae8e4
Adding new EQDSK reader
mlstowell Mar 29, 2022
a643f68
Bringing up to date with dh-sheath-bc-dev
mlstowell Mar 30, 2022
4f9dfa2
Distinguishing real and complex valued vector vis objects
mlstowell Mar 30, 2022
e2c83b6
Adding B field vis in stix_r2d_dh
mlstowell Mar 30, 2022
ea419cd
Correcting the interpretation of 1D fields in EQDSK files
mlstowell May 12, 2022
eef6372
Supping files which don't specify SIBRY
mlstowell May 13, 2022
97f890b
Fixing bug related to non-square grids of PSI data
mlstowell May 13, 2022
08f75ab
Plotting boundary and limiter as separate meshes
mlstowell May 13, 2022
ca8b6f8
Adding fudge factor to remove ion cyclotron singularity
mlstowell May 20, 2022
6f03511
Generalizing initial AMR options
mlstowell Jun 25, 2022
b043ba5
Adding new options to command line record
mlstowell Jun 25, 2022
31a2548
Adding experimental support for sheath BC
mlstowell Jun 30, 2022
8318180
Adding a density profile to approximate a WHAM simulation
mlstowell Nov 11, 2022
8cb39a6
Merge remote-tracking branch 'origin/master' into stix-r2d-dev
mlstowell Nov 17, 2022
6c4bfb2
Adding SPARC related coefficients
mlstowell Jan 23, 2023
93d969c
Adding new coef definitions
mlstowell Jan 23, 2023
08a7c2c
Adding resonance limiter to Stix coefficients
mlstowell Jan 28, 2023
e6a8fea
Fixing phase shift vector in cylindrical coordinates
mlstowell Jan 28, 2023
cda8ca0
Adding support for minority species
mlstowell Jan 28, 2023
163dcf4
Bugfix in numbers of parameters for plasma profiles
mlstowell Jan 28, 2023
7fcc946
Bugfix in phase shift contribution to curl curl operator
mlstowell Jan 28, 2023
dbc8dbc
Bugfix in B field visualization
mlstowell Jan 28, 2023
72be55d
Bringing DH version up to date with EB version in terms of sources an…
mlstowell Jan 28, 2023
4c8e994
Correcting minority treatment in DH version
mlstowell Jan 30, 2023
b16e2e0
Adding resonance limiter to Stix coefs
mlstowell Jan 30, 2023
99c9784
New coefs and sources
mlstowell Jan 30, 2023
60d806b
Fixing bug in GausssLaw objects
mlstowell Jan 30, 2023
3d737bb
Fixing SuperLU usage bug in DH solver
mlstowell Jan 30, 2023
563611c
Merge remote-tracking branch 'origin/master' into stix-r2d-dev
mlstowell May 25, 2023
a5b7da7
Commenting unused variables
mlstowell Apr 1, 2024
5bd37d6
Merge remote-tracking branch 'origin/master' into stix-r2d-dev
mlstowell Apr 1, 2024
4ac3152
Removing extraneous changes from GMRES implementation
mlstowell Apr 1, 2024
26ad7df
Updating used of MPI and GetRangeDim
mlstowell Apr 1, 2024
eecb3fc
Fixing deprecation warnings
mlstowell Apr 1, 2024
0b8bad2
Updating copyright dates
mlstowell Apr 1, 2024
9c46a2a
Fixing doxygen comments
mlstowell Apr 1, 2024
5b4e5b1
Avoiding compiler warnings
mlstowell Apr 1, 2024
13c79d4
More doxygen and copyright fixes
mlstowell Apr 2, 2024
fadae22
Updating gitignore
mlstowell Apr 2, 2024
34e70b6
Adding missing header file
mlstowell Apr 2, 2024
e4c9612
Fixing "test" targets in makefile
mlstowell Apr 2, 2024
8a85e99
Fixing ND_R2D_Segment to support embedding on 2D curves
mlstowell Apr 3, 2024
cb2271e
Find another way to address vector fields on segments of 2D curves
mlstowell Apr 3, 2024
7ab37d1
Fixing compiler warning regarding unused variable
mlstowell Apr 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,9 @@ miniapps/performance/refined.mesh
miniapps/performance/mesh.*
miniapps/performance/sol.*

miniapps/plasma/stix_r2d_dh
miniapps/plasma/stix_r2d_eb

miniapps/shifted/distance
miniapps/shifted/ParaViewDistance
miniapps/shifted/ParaViewLSF
Expand Down
2 changes: 1 addition & 1 deletion fem/bilininteg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4361,7 +4361,7 @@ ScalarVectorProductInterpolator::AssembleElementMatrix2(
}
};

VShapeCoefficient dom_shape_coeff(*Q, dom_fe, Trans.GetSpaceDim());
VShapeCoefficient dom_shape_coeff(*Q, dom_fe, dom_fe.GetRangeDim());

elmat.SetSize(ran_fe.GetDof(),dom_fe.GetDof());

Expand Down
186 changes: 186 additions & 0 deletions fem/complex_fem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1415,6 +1415,192 @@ ParSesquilinearForm::Update(FiniteElementSpace *nfes)
if ( pblfi ) { pblfi->Update(nfes); }
}

bool ParMixedSesquilinearForm::RealInteg()
{
int nint = pblfr->GetTFBFI()->Size() + pblfr->GetDBFI()->Size() +
pblfr->GetBBFI()->Size() + pblfr->GetBTFBFI()->Size();
return (nint != 0);
}

bool ParMixedSesquilinearForm::ImagInteg()
{
int nint = pblfi->GetTFBFI()->Size() + pblfi->GetDBFI()->Size() +
pblfi->GetBBFI()->Size() + pblfi->GetBTFBFI()->Size();
return (nint != 0);
}

ParMixedSesquilinearForm::ParMixedSesquilinearForm(ParFiniteElementSpace *tr_pf,
ParFiniteElementSpace *te_pf,
ComplexOperator::Convention
convention)
: conv(convention),
pblfr(new ParMixedBilinearForm(tr_pf, te_pf)),
pblfi(new ParMixedBilinearForm(tr_pf, te_pf))
{}

ParMixedSesquilinearForm::ParMixedSesquilinearForm(ParFiniteElementSpace *tr_pf,
ParFiniteElementSpace *te_pf,
ParMixedBilinearForm *pbfr,
ParMixedBilinearForm *pbfi,
ComplexOperator::Convention convention)
: conv(convention),
pblfr(new ParMixedBilinearForm(tr_pf,te_pf,pbfr)),
pblfi(new ParMixedBilinearForm(tr_pf,te_pf,pbfi))
{}

ParMixedSesquilinearForm::~ParMixedSesquilinearForm()
{
delete pblfr;
delete pblfi;
}

void ParMixedSesquilinearForm::Mult(const ParComplexGridFunction & x,
ParComplexLinearForm & y) const
{
pblfr->Mult(x.real(), y.real());
pblfi->AddMult(x.imag(), y.real(), -1.0);

pblfr->Mult(x.imag(), y.imag());
pblfi->AddMult(x.real(), y.imag(), 1.0);

if (conv == ComplexOperator::Convention::BLOCK_SYMMETRIC)
{
y.imag() *= -1.0;
}

}

void ParMixedSesquilinearForm::AddDomainIntegrator(BilinearFormIntegrator
*bfi_real,
BilinearFormIntegrator
*bfi_imag)
{
if (bfi_real) { pblfr->AddDomainIntegrator(bfi_real); }
if (bfi_imag) { pblfi->AddDomainIntegrator(bfi_imag); }
}

void
ParMixedSesquilinearForm::AddBoundaryIntegrator(BilinearFormIntegrator
*bfi_real,
BilinearFormIntegrator *bfi_imag)
{
if (bfi_real) { pblfr->AddBoundaryIntegrator(bfi_real); }
if (bfi_imag) { pblfi->AddBoundaryIntegrator(bfi_imag); }
}

void
ParMixedSesquilinearForm::AddBoundaryIntegrator(BilinearFormIntegrator
*bfi_real,
BilinearFormIntegrator *bfi_imag,
Array<int> & bdr_marker)
{
if (bfi_real) { pblfr->AddBoundaryIntegrator(bfi_real, bdr_marker); }
if (bfi_imag) { pblfi->AddBoundaryIntegrator(bfi_imag, bdr_marker); }
}

void
ParMixedSesquilinearForm::AddTraceFaceIntegrator(BilinearFormIntegrator
*bfi_real,
BilinearFormIntegrator *bfi_imag)
{
if (bfi_real) { pblfr->AddTraceFaceIntegrator(bfi_real); }
if (bfi_imag) { pblfi->AddTraceFaceIntegrator(bfi_imag); }
}

void
ParMixedSesquilinearForm::AddBdrTraceFaceIntegrator(BilinearFormIntegrator
*bfi_real,
BilinearFormIntegrator *bfi_imag)
{
if (bfi_real) { pblfr->AddBdrTraceFaceIntegrator(bfi_real); }
if (bfi_imag) { pblfi->AddBdrTraceFaceIntegrator(bfi_imag); }
}

void
ParMixedSesquilinearForm::AddBdrTraceFaceIntegrator(BilinearFormIntegrator
*bfi_real,
BilinearFormIntegrator *bfi_imag,
Array<int> &bdr_marker)
{
if (bfi_real) { pblfr->AddBdrTraceFaceIntegrator(bfi_real, bdr_marker); }
if (bfi_imag) { pblfi->AddBdrTraceFaceIntegrator(bfi_imag, bdr_marker); }
}

void
ParMixedSesquilinearForm::Assemble(int skip_zeros)
{
pblfr->Assemble(skip_zeros);
pblfi->Assemble(skip_zeros);
}

void
ParMixedSesquilinearForm::Finalize(int skip_zeros)
{
pblfr->Finalize(skip_zeros);
pblfi->Finalize(skip_zeros);
}

ComplexHypreParMatrix *
ParMixedSesquilinearForm::ParallelAssemble()
{
return new ComplexHypreParMatrix(pblfr->ParallelAssemble(),
pblfi->ParallelAssemble(),
true, true, conv);
}

void ParMixedSesquilinearForm::FormRectangularSystemMatrix(
const Array<int> &trial_tdof_list,
const Array<int> &test_tdof_list,
OperatorHandle &A)
{
OperatorHandle A_r, A_i;
if (RealInteg())
{
pblfr->FormRectangularSystemMatrix(trial_tdof_list, test_tdof_list, A_r);
}
if (ImagInteg())
{
pblfi->FormRectangularSystemMatrix(trial_tdof_list, test_tdof_list, A_i);
}
if (!RealInteg() && !ImagInteg())
{
MFEM_ABORT("Both Real and Imaginary part of the MixedSesquilinear form are empty");
}

// A = A_r + i A_i
A.Clear();
if ( A_r.Type() == Operator::Hypre_ParCSR ||
A_i.Type() == Operator::Hypre_ParCSR )
{
ComplexHypreParMatrix * A_hyp =
new ComplexHypreParMatrix(A_r.As<HypreParMatrix>(),
A_i.As<HypreParMatrix>(),
A_r.OwnsOperator(),
A_i.OwnsOperator(),
conv);
A.Reset<ComplexHypreParMatrix>(A_hyp, true);
}
else
{
ComplexOperator * A_op =
new ComplexOperator(A_r.As<Operator>(),
A_i.As<Operator>(),
A_r.OwnsOperator(),
A_i.OwnsOperator(),
conv);
A.Reset<ComplexOperator>(A_op, true);
}
A_r.SetOperatorOwner(false);
A_i.SetOperatorOwner(false);
}

void
ParMixedSesquilinearForm::Update()
{
if ( pblfr ) { pblfr->Update(); }
if ( pblfi ) { pblfi->Update(); }
}

#endif // MFEM_USE_MPI

}
142 changes: 141 additions & 1 deletion fem/complex_fem.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,12 @@ class ParComplexLinearForm : public Vector
void AddDomainIntegrator(LinearFormIntegrator *lfi_real,
LinearFormIntegrator *lfi_imag);

/// Adds new Domain Integrator, restricted to specific attributes.
/** @brief Add new Domain Integrator, restricted to specific attributes.

Assumes ownership of @a lfi_real and @a lfi_imag.

The array @a attr_marker is stored internally as a pointer to the
given Array<int> object. */
void AddDomainIntegrator(LinearFormIntegrator *lfi_real,
LinearFormIntegrator *lfi_imag,
Array<int> &elem_attr_marker);
Expand Down Expand Up @@ -682,6 +687,141 @@ class ParSesquilinearForm
virtual ~ParSesquilinearForm();
};

/** Class for a parallel mixed sesquilinear form

A sesquilinear form is a generalization of a mixed bilinear form to
complex-valued fields. Sesquilinear forms are linear in the second argument
but the first argument involves a complex conjugate in the sense that:

a(alpha u, beta v) = conj(alpha) beta a(u, v)

The @a convention argument in the class's constructor is documented in the
mfem::ComplexOperator class found in linalg/complex_operator.hpp.

When supplying integrators to the ParSesquilinearForm either the real or
imaginary integrator can be NULL. This indicates that the corresponding
portion of the complex-valued material coefficient is equal to zero.
*/
class ParMixedSesquilinearForm
{
private:
ComplexOperator::Convention conv;

ParMixedBilinearForm *pblfr;
ParMixedBilinearForm *pblfi;

/* These methods check if the real/imag parts of the sesqulinear form are not
empty */
bool RealInteg();
bool ImagInteg();

public:
ParMixedSesquilinearForm(ParFiniteElementSpace *tr_pf,
ParFiniteElementSpace *te_pf,
ComplexOperator::Convention
convention = ComplexOperator::HERMITIAN);

/** @brief Create a ParMixedSesquilinearForm on the ParFiniteElementSpaces
@a tr_pf and @a te_pf, using the same integrators as the
ParMixedBilinearForms @a pbfr and @a pbfi .

The pointer @a pf is not owned by the newly constructed object.

The integrators are copied as pointers and they are not owned by the
newly constructed ParSesquilinearForm. */
ParMixedSesquilinearForm(ParFiniteElementSpace *tr_pf,
ParFiniteElementSpace *te_pf,
ParMixedBilinearForm *pbfr,
ParMixedBilinearForm *pbfi,
ComplexOperator::Convention
convention = ComplexOperator::HERMITIAN);

ComplexOperator::Convention GetConvention() const { return conv; }
void SetConvention(const ComplexOperator::Convention &
convention) { conv = convention; }

/// Set the desired assembly level.
/** Valid choices are:

- AssemblyLevel::LEGACYFULL (default)
- AssemblyLevel::FULL
- AssemblyLevel::PARTIAL
- AssemblyLevel::ELEMENT
- AssemblyLevel::NONE

This method must be called before assembly. */
void SetAssemblyLevel(AssemblyLevel assembly_level)
{
pblfr->SetAssemblyLevel(assembly_level);
pblfi->SetAssemblyLevel(assembly_level);
}

ParMixedBilinearForm & real() { return *pblfr; }
ParMixedBilinearForm & imag() { return *pblfi; }
const ParMixedBilinearForm & real() const { return *pblfr; }
const ParMixedBilinearForm & imag() const { return *pblfi; }

/// Matrix multiplication: $ y = M x $
void Mult(const ParComplexGridFunction & x,
ParComplexLinearForm & y) const;

/// Adds new Domain Integrator.
void AddDomainIntegrator(BilinearFormIntegrator *bfi_real,
BilinearFormIntegrator *bfi_imag);

/// Adds new Boundary Integrator.
void AddBoundaryIntegrator(BilinearFormIntegrator *bfi_real,
BilinearFormIntegrator *bfi_imag);

/** @brief Adds new boundary Integrator, restricted to specific boundary
attributes.

Assumes ownership of @a bfi.

The array @a bdr_marker is stored internally as a pointer to the given
Array<int> object. */
void AddBoundaryIntegrator(BilinearFormIntegrator *bfi_real,
BilinearFormIntegrator *bfi_imag,
Array<int> &bdr_marker);

/// Adds new Face Integrator. Assumes ownership of @a bfi.
void AddTraceFaceIntegrator(BilinearFormIntegrator *bfi_real,
BilinearFormIntegrator *bfi_imag);

/// Adds new boundary Face Integrator. Assumes ownership of @a bfi.
void AddBdrTraceFaceIntegrator(BilinearFormIntegrator *bfi_real,
BilinearFormIntegrator *bfi_imag);

/** @brief Adds new boundary Face Integrator, restricted to specific boundary
attributes.

Assumes ownership of @a bfi.

The array @a bdr_marker is stored internally as a pointer to the given
Array<int> object. */
void AddBdrTraceFaceIntegrator(BilinearFormIntegrator *bfi_real,
BilinearFormIntegrator *bfi_imag,
Array<int> &bdr_marker);

/// Assemble the local matrix
void Assemble(int skip_zeros = 1);

/// Finalizes the matrix initialization.
void Finalize(int skip_zeros = 1);

/// Returns the matrix assembled on the true dofs, i.e. P_test^t A P_trial.
/** The returned matrix has to be deleted by the caller. */
ComplexHypreParMatrix *ParallelAssemble();

void FormRectangularSystemMatrix(const Array<int> &trial_tdof_list,
const Array<int> &test_tdof_list,
OperatorHandle &A);

virtual void Update();

virtual ~ParMixedSesquilinearForm();
};

#endif // MFEM_USE_MPI

}
Expand Down