diff --git a/applications/solvers/basic/laplacianFoam/Make/files b/applications/solvers/basic/laplacianFoam/Make/files
index 290d5d6e92..b1027ce8fd 100644
--- a/applications/solvers/basic/laplacianFoam/Make/files
+++ b/applications/solvers/basic/laplacianFoam/Make/files
@@ -1,5 +1,3 @@
-/* lduPrimitiveMesh.C */
-
laplacianFoam.C
EXE = $(FOAM_APPBIN)/laplacianFoam
diff --git a/applications/solvers/basic/laplacianFoam/lduPrimitiveMesh-hack.C b/applications/solvers/basic/laplacianFoam/lduPrimitiveMesh-hack.C
deleted file mode 100644
index 4de262b5d0..0000000000
--- a/applications/solvers/basic/laplacianFoam/lduPrimitiveMesh-hack.C
+++ /dev/null
@@ -1,1414 +0,0 @@
-/*---------------------------------------------------------------------------*\
- ========= |
- \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
- \\ / O peration |
- \\ / A nd | www.openfoam.com
- \\/ M anipulation |
--------------------------------------------------------------------------------
- Copyright (C) 2013-2017 OpenFOAM Foundation
- Copyright (C) 2019,2022 OpenCFD Ltd.
--------------------------------------------------------------------------------
-License
- This file is part of OpenFOAM.
-
- OpenFOAM is free software: you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
-
- You should have received a copy of the GNU General Public License
- along with OpenFOAM. If not, see .
-
-\*---------------------------------------------------------------------------*/
-
-#include "lduPrimitiveMesh.H"
-#include "processorLduInterface.H"
-#include "edgeHashes.H"
-#include "labelPair.H"
-#include "processorGAMGInterface.H"
-#include "cyclicAMIGAMGInterface.H"
-
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
-
-namespace Foam
-{
- defineTypeNameAndDebug(lduPrimitiveMesh, 0);
-}
-
-
-// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
-
-void Foam::lduPrimitiveMesh::checkUpperTriangular
-(
- const label size,
- const labelUList& l,
- const labelUList& u
-)
-{
- forAll(l, facei)
- {
- if (u[facei] < l[facei])
- {
- FatalErrorInFunction
- << "Reversed face. Problem at face " << facei
- << " l:" << l[facei] << " u:" << u[facei]
- << abort(FatalError);
- }
- if (l[facei] < 0 || u[facei] < 0 || u[facei] >= size)
- {
- FatalErrorInFunction
- << "Illegal cell label. Problem at face " << facei
- << " l:" << l[facei] << " u:" << u[facei]
- << abort(FatalError);
- }
- }
-
- for (label facei=1; facei < l.size(); ++facei)
- {
- if (l[facei-1] > l[facei])
- {
- FatalErrorInFunction
- << "Lower not in incremental cell order."
- << " Problem at face " << facei
- << " l:" << l[facei] << " u:" << u[facei]
- << " previous l:" << l[facei-1]
- << abort(FatalError);
- }
- else if (l[facei-1] == l[facei])
- {
- // Same cell.
- if (u[facei-1] > u[facei])
- {
- FatalErrorInFunction
- << "Upper not in incremental cell order."
- << " Problem at face " << facei
- << " l:" << l[facei] << " u:" << u[facei]
- << " previous u:" << u[facei-1]
- << abort(FatalError);
- }
- }
- }
-}
-
-
-Foam::labelListList Foam::lduPrimitiveMesh::globalCellCells
-(
- const lduMesh& mesh,
- const globalIndex& globalNumbering
-)
-{
- const lduAddressing& addr = mesh.lduAddr();
- lduInterfacePtrsList interfaces = mesh.interfaces();
-
- const labelList globalIndices
- (
- identity
- (
- addr.size(),
- globalNumbering.localStart(UPstream::myProcNo(mesh.comm()))
- )
- );
-
- // Get the interface cells
- PtrList nbrGlobalCells(interfaces.size());
- {
- // Initialise transfer of restrict addressing on the interface
- forAll(interfaces, inti)
- {
- if (interfaces.set(inti))
- {
- interfaces[inti].initInternalFieldTransfer
- (
- Pstream::commsTypes::nonBlocking,
- globalIndices
- );
- }
- }
-
- // Wait for all
- UPstream::waitRequests();
-
- forAll(interfaces, inti)
- {
- if (interfaces.set(inti))
- {
- nbrGlobalCells.set
- (
- inti,
- new labelList
- (
- interfaces[inti].internalFieldTransfer
- (
- Pstream::commsTypes::nonBlocking,
- globalIndices
- )
- )
- );
- }
- }
- }
-
-
- // Scan the neighbour list to find out how many times the cell
- // appears as a neighbour of the face. Done this way to avoid guessing
- // and resizing list
- labelList nNbrs(addr.size(), Zero);
-
- const labelUList& nbr = addr.upperAddr();
- const labelUList& own = addr.lowerAddr();
-
- {
- forAll(nbr, facei)
- {
- nNbrs[nbr[facei]]++;
- nNbrs[own[facei]]++;
- }
-
- forAll(interfaces, inti)
- {
- if (interfaces.set(inti))
- {
- for (const label celli : interfaces[inti].faceCells())
- {
- nNbrs[celli]++;
- }
- }
- }
- }
-
-
- // Create cell-cells addressing
- labelListList cellCells(addr.size());
-
- forAll(cellCells, celli)
- {
- cellCells[celli].setSize(nNbrs[celli], -1);
- }
-
- // Reset the list of number of neighbours to zero
- nNbrs = 0;
-
- // Scatter the neighbour faces
- forAll(nbr, facei)
- {
- const label c0 = own[facei];
- const label c1 = nbr[facei];
-
- cellCells[c0][nNbrs[c0]++] = globalIndices[c1];
- cellCells[c1][nNbrs[c1]++] = globalIndices[c0];
- }
- forAll(interfaces, inti)
- {
- if (interfaces.set(inti))
- {
- const labelUList& faceCells = interfaces[inti].faceCells();
-
- forAll(faceCells, facei)
- {
- const label c0 = faceCells[facei];
- cellCells[c0][nNbrs[c0]++] = nbrGlobalCells[inti][facei];
- }
- }
- }
-
- return cellCells;
-}
-
-
-Foam::label Foam::lduPrimitiveMesh::totalSize
-(
- const PtrList& meshes
-)
-{
- label size = 0;
-
- for (const lduPrimitiveMesh& msh : meshes)
- {
- size += msh.lduAddr().size();
- }
- return size;
-}
-
-
-Foam::labelList Foam::lduPrimitiveMesh::upperTriOrder
-(
- const label nCells,
- const labelUList& lower,
- const labelUList& upper
-)
-{
- labelList nNbrs(nCells, Zero);
-
- // Count number of upper neighbours
- forAll(lower, facei)
- {
- if (upper[facei] < lower[facei])
- {
- FatalErrorInFunction
- << "Problem at face:" << facei
- << " lower:" << lower[facei]
- << " upper:" << upper[facei]
- << exit(FatalError);
- }
- nNbrs[lower[facei]]++;
- }
-
- // Construct cell-upper cell addressing
- labelList offsets(nCells+1);
- offsets[0] = 0;
- forAll(nNbrs, celli)
- {
- offsets[celli+1] = offsets[celli]+nNbrs[celli];
- }
-
- nNbrs = offsets;
-
- labelList cellToFaces(offsets.last());
- forAll(upper, facei)
- {
- const label celli = lower[facei];
- cellToFaces[nNbrs[celli]++] = facei;
- }
-
- // Sort
-
- labelList oldToNew(lower.size());
-
- DynamicList