69 size_t nDim = pFields[0]->GetCoordim(0);
70 size_t nVariable = pFields.size();
71 size_t nTracePts = pFields[0]->GetTrace()->GetTotPoints();
74 for (
int i = 0; i < nDim; ++i)
80 for (
int i = 0; i < nVariable; ++i)
95 pFields[0]->GetTrace()->GetElmtNormalLength(lengthFwd, lengthBwd);
99 pFields[0]->GetTraceMap()->GetAssemblyCommDG()->PerformExchange(lengthFwd,
103 pFields[0]->PeriodicBwdCopy(lengthFwd, lengthBwd);
111 for (
int i = 0; i < nTracePts; ++i)
116 lengthBwd[i] = lengthFwd[i];
123 Vmath::Vadd(nTracePts, lengthBwd, 1, lengthFwd, 1, lengthsum, 1);
124 Vmath::Vmul(nTracePts, lengthBwd, 1, lengthFwd, 1, lengthmul, 1);
125 Vmath::Vdiv(nTracePts, lengthsum, 1, lengthmul, 1, lengthFwd, 1);
136 for (
int i = 1; i < nVariable; ++i)
138 pFields[i]->GetBwdWeight(tmpBwdWeight, tmpBwdWeightJump);
141 Vmath::Vabs(nTracePts, tmpBwdWeight, 1, tmpBwdWeight, 1);
143 for (
int j = 0; j < nTracePts; ++j)
145 norm += tmpBwdWeight[j];
148 "different BWD for different variable not coded yet");
152 size_t nCoeffs = pFields[0]->GetNcoeffs();
154 for (
int i = 0; i < nVariable; ++i)
162 for (
int nd = 0; nd < nDim; ++nd)
166 for (
int i = 0; i < nVariable; ++i)
175 const size_t nConvectiveFields,
187 for (
int i = 0; i < nConvectiveFields; ++i)
189 fields[i]->BwdTrans(
m_wspDiff[i], outarray[i]);
196 const size_t nConvectiveFields,
203 if (fields[0]->GetGraph()->GetMovement()->GetMoveFlag())
212 size_t nDim = fields[0]->GetCoordim(0);
213 size_t nPts = fields[0]->GetTotPoints();
214 size_t nCoeffs = fields[0]->GetNcoeffs();
215 size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
223 for (
int j = 0; j < nDim; ++j)
227 for (
int i = 0; i < nConvectiveFields; ++i)
231 for (
int i = 0; i < nConvectiveFields; ++i)
243 for (
int i = 0; i < nConvectiveFields; ++i)
248 for (
int i = 0; i < nConvectiveFields; ++i)
250 fields[i]->GetFwdBwdTracePhys(inarray[i], vFwd[i], vBwd[i]);
253 fields[0]->PeriodicBwdRot(vBwd);
254 if (fields[0]->GetGraph()->GetMovement()->GetSectorRotateFlag())
256 fields[0]->RotLocalBwdTrace(vBwd);
261 for (
int i = 0; i < nConvectiveFields; ++i)
278 for (
int i = 0; i < nonZeroIndex.size(); ++i)
280 int j = nonZeroIndex[i];
281 for (
int k = 0; k < nDim; ++k)
283 tmpFluxIprdct[k] = elmtFlux[k][j];
285 fields[j]->IProductWRTDerivBase(tmpFluxIprdct, outarray[j]);
293 for (
int j = 0; j < nDim; ++j)
300 for (
int j = 0; j < nConvectiveFields; ++j)
310 for (
int i = 0; i < nonZeroIndex.size(); ++i)
312 int j = nonZeroIndex[i];
314 fields[j]->AddTraceIntegral(Traceflux[j], outarray[j]);
315 fields[j]->SetPhysState(
false);
319 elmtFlux, outarray, vFwd, vBwd);
324 if (!fields[0]->GetGraph()->GetMovement()->GetMeshDistortedFlag())
326 for (
int i = 0; i < nonZeroIndex.size(); ++i)
328 int j = nonZeroIndex[i];
330 fields[j]->MultiplyByElmtInvMass(outarray[j], outarray[j]);
346 size_t nDim = fields[0]->GetCoordim(0);
347 for (
int nd = 0; nd < 3; ++nd)
352 size_t nConvectiveFields = inarray.size();
353 for (
int i = 0; i < nConvectiveFields; ++i)
355 for (
int nd = 0; nd < nDim; ++nd)
357 qtmp[nd] = qfield[nd][i];
359 fields[i]->PhysDeriv(inarray[i], qtmp[0], qtmp[1], qtmp[2]);
369 size_t nDim = fields[0]->GetCoordim(0);
392 traceflux3D[0] = TraceFlux;
394 size_t nConvectiveFields = fields.size();
406 const std::size_t nConvectiveFields,
416 size_t nDim = fields[0]->GetCoordim(0);
417 size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
419 for (
int nd = 0; nd < nDim; ++nd)
423 for (
int j = 0; j < nConvectiveFields; ++j)
430 VolumeFlux, traceSymflux, pFwd, pBwd,
434 nonZeroIndex, traceSymflux, outarray);
439 const std::size_t nConvectiveFields,
449 size_t nDim = fields[0]->GetCoordim(0);
452 nonZeroIndex, SymmFlux);
456 const std::size_t nConvectiveFields,
const size_t nDim,
462 size_t nTracePts = solution_jump[nConvectiveFields - 1].size();
467 for (
int nd = 0; nd < nDim; ++nd)
469 for (
int j = 0; j < nonZeroIndexsymm.size(); ++j)
471 int i = nonZeroIndexsymm[j];
473 traceSymflux[nd][i], 1, traceSymflux[nd][i], 1);
479 const std::size_t nConvectiveFields,
const size_t nDim,
485 size_t nCoeffs = outarray[nConvectiveFields - 1].size();
489 for (
int j = 0; j < nonZeroIndex.size(); ++j)
491 nv = nonZeroIndex[j];
492 auto tracelist = fields[nv]->GetTrace();
493 auto locTraceToTraceMap = fields[nv]->GetLocTraceToTraceMap();
495 std::dynamic_pointer_cast<MultiRegions::DisContField>(fields[nv]);
508 for (
int nd = 0; nd < nDim; ++nd)
512 locTraceToTraceMap->InterpTraceToLocTrace(0, tracflux[nd][nv],
514 locTraceToTraceMap->UnshuffleLocTraces(0, wsp2, wsp);
516 locTraceBwd = wsp2 + locTraceToTraceMap->GetNFwdLocTracePts();
517 locTraceToTraceMap->InterpTraceToLocTrace(1, tracflux[nd][nv],
519 locTraceToTraceMap->UnshuffleLocTraces(1, locTraceBwd, wsp);
524 locTraceToTraceMap->ReshuffleLocTracesForInterp(
525 0, wsp, locTracesDotNorm[nd]);
527 locTracesDotNorm[nd] + locTraceToTraceMap->GetNFwdLocTracePts();
528 locTraceToTraceMap->ReshuffleLocTracesForInterp(1, wsp,
532 locTraceToTraceMap->AddLocTracesToField(locTracesDotNorm[nd],
540 Vmath::Vadd(nCoeffs, outarray[nv], 1, tmpCoeff, 1, outarray[nv], 1);
549 std::shared_ptr<LocalRegions::ExpansionVector> traceExp =
551 size_t ntotTrac = (*traceExp).size();
552 int nTracPnt, noffset;
555 fields[0]->GetLocTraceToTraceMap();
558 locTraceToTraceMap->GetLeftRightAdjacentExpId();
560 locTraceToTraceMap->GetLeftRightAdjacentExpFlag();
562 std::shared_ptr<LocalRegions::ExpansionVector> fieldExp =
571 for (
int ntrace = 0; ntrace < ntotTrac; ++ntrace)
573 noffset = tracelist->GetPhys_Offset(ntrace);
574 nTracPnt = tracelist->GetTotPoints(ntrace);
576 factorFwdBwd[0] = 0.0;
577 factorFwdBwd[1] = 0.0;
579 for (
int nlr = 0; nlr < 2; ++nlr)
581 if (LRAdjflag[nlr][ntrace])
584 for (
int nd = 0; nd < spaceDim; nd++)
587 ->GetExp(LRAdjExpid[nlr][ntrace])
588 ->GetBasisNumModes(nd);
589 numModes = std::max(ntmp, numModes);
591 factorFwdBwd[nlr] = (numModes) * (numModes);
595 for (
int np = 0; np < nTracPnt; ++np)
597 factor[noffset + np] = std::max(factorFwdBwd[0], factorFwdBwd[1]);
603 const std::size_t nConvectiveFields,
const size_t nPts,
609 std::vector<NekDouble> vFwdTmp(nConvectiveFields),
610 vBwdTmp(nConvectiveFields), averTmp(nConvectiveFields);
611 for (
size_t p = 0; p < nPts; ++p)
614 for (
size_t f = 0; f < nConvectiveFields; ++f)
616 vFwdTmp[f] = vFwd[f][p];
617 vBwdTmp[f] = vBwd[f][p];
624 for (
size_t f = 0; f < nConvectiveFields; ++f)
626 aver[f][p] = averTmp[f];
637 for (
size_t f = 0; f < nConvectiveFields; ++f)
639 for (
size_t p = 0; p < nPts; ++p)
644 NekDouble tmpF = aver[f][p] - vFwd[f][p];
645 NekDouble tmpB = vBwd[f][p] - aver[f][p];
646 jump[f][p] = tmpF * Fweight + tmpB * Bweight;
662 size_t nDim = fields[0]->GetCoordim(0);
663 size_t nPts = fields[0]->GetTotPoints();
664 size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
665 size_t nConvectiveFields = fields.size();
668 fields[0]->GetTraceMap();
670 fields[0]->GetInterfaceMap();
675 for (
int nd = 0; nd < nDim; ++nd)
677 for (
int i = 0; i < nConvectiveFields; ++i)
692 if (fabs(PenaltyFactor2) > 1.0E-12)
701 for (
int nd = 0; nd < nDim; ++nd)
703 for (
int i = 0; i < nConvectiveFields; ++i)
709 fields[i]->GetFwdBwdTracePhys(qfield[nd][i], Fwd, Bwd,
true,
true,
714 for (
size_t p = 0; p < nTracePts; ++p)
721 TraceMap->GetAssemblyCommDG()->PerformExchange(
733 if (fields[0]->GetGraph()->GetMovement()->GetSectorRotateFlag())
738 for (
int nd = 0; nd < nDim; ++nd)
741 for (
int i = 0; i < nConvectiveFields; ++i)
749 ConsVarAveJump(nConvectiveFields, nTracePts, vFwd, vBwd, solution_Aver,
756 for (
size_t p = 0; p < nTracePts; ++p)
761 for (
size_t f = 0; f < nConvectiveFields; ++f)
763 NekDouble jumpTmp = solution_jump[f][p] * PenaltyFactor;
764 for (
size_t d = 0; d < nDim; ++d)
776 traceflux, nonZeroIndexflux,
783 const std::size_t nConvectiveFields,
const size_t nDim,
const size_t nPts,
784 const size_t nTracePts,
const NekDouble PenaltyFactor2,
792 std::vector<NekDouble> tmp(nTracePts);
795 for (
int nd1 = 0; nd1 < nDim; ++nd1)
801 for (
int nd = 0; nd < 3; ++nd)
805 for (
int nd2 = 0; nd2 < nDim; ++nd2)
807 qtmp[nd2] = elmt2ndDerv[nd2];
810 for (
int i = 0; i < nTracePts; ++i)
815 for (
int nd1 = 0; nd1 < nDim; ++nd1)
817 for (
int i = 0; i < nConvectiveFields; ++i)
819 fields[i]->PhysDeriv(qfield[nd1][i], qtmp[0], qtmp[1], qtmp[2]);
821 for (
int nd2 = nd1; nd2 < nDim; ++nd2)
824 fields[i]->GetFwdBwdTracePhys(elmt2ndDerv[nd2], Fwd, Bwd,
true,
826 for (
int p = 0; p < nTracePts; ++p)
832 numDerivFwd[nd1][i][p]);
836 for (
int p = 0; p < nTracePts; ++p)
838 numDerivBwd[nd2][i][p] +=
840 numDerivFwd[nd2][i][p] =
842 numDerivFwd[nd2][i][p]);
856 const int nConvectiveFields,
860 int nengy = nConvectiveFields - 1;
864 size_t nBndRegions = fields[nengy]->GetBndCondExpansions().size();
865 for (
size_t j = 0; j < nBndRegions; ++j)
867 if (fields[nengy]->GetBndConditions()[j]->GetBoundaryConditionType() ==
874 fields[nengy]->GetBndCondExpansions()[j]->GetExpSize();
875 for (
size_t e = 0; e < nBndEdges; ++e)
877 size_t nBndEdgePts = fields[nengy]
878 ->GetBndCondExpansions()[j]
882 std::size_t id2 = fields[0]->GetTrace()->GetPhys_Offset(
883 fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt++));
885 if (fields[0]->GetBndConditions()[j]->GetUserDefined() ==
#define ASSERTL0(condition, msg)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
void AccumulateRegion(std::string, int iolevel=0)
Accumulate elapsed time for a region.
This class is the abstractio n of a global discontinuous two- dimensional spectral/hp element expansi...
ExpListSharedPtr & GetLocElmtTrace()
void IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function calculates the inner product of a function with respect to the derivative (in directio...
void DivideByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Divided by the metric jacobi and quadrature weights.
int GetTotPoints(void) const
Returns the total number of quadrature points m_npoints .
SOLVER_UTILS_EXPORT void DiffuseCalcDerivative(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfields, const Array< OneD, Array< OneD, NekDouble > > &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble > > &pBwd=NullNekDoubleArrayOfArray)
DiffusionFluxCons m_FunctorDiffusionfluxConsTrace
SOLVER_UTILS_EXPORT void DiffuseVolumeFlux(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, int > &nonZeroIndex=NullInt1DArray)
Diffusion Volume FLux.
SOLVER_UTILS_EXPORT void DiffuseTraceFlux(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, Array< OneD, NekDouble > > &TraceFlux, const Array< OneD, Array< OneD, NekDouble > > &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble > > &pBwd=NullNekDoubleArrayOfArray, Array< OneD, int > &nonZeroIndex=NullInt1DArray)
Diffusion term Trace Flux.
DiffusionFluxCons m_FunctorDiffusionfluxCons
SpecialBndTreat m_SpecialBndTreat
DiffusionSymmFluxCons m_FunctorSymmetricfluxCons
Array< OneD, NekDouble > m_traceNormDirctnElmtLengthRecip
void v_DiffuseCoeffs(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd) override
static DiffusionSharedPtr create(std::string diffType)
Array< OneD, NekDouble > m_tracBwdWeightAver
Array< OneD, NekDouble > m_traceNormDirctnElmtLength
void ApplyFluxBndConds(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, Array< OneD, Array< OneD, NekDouble > > &flux)
aplly Neuman boundary conditions on flux Currently only consider WallAdiabatic
void GetPenaltyFactor(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, Array< OneD, NekDouble > &factor)
Get IP penalty factor based on order.
void ConsVarAve(const size_t nConvectiveFields, const T &Bweight, const std::vector< T > &vFwd, const std::vector< T > &vBwd, std::vector< T > &aver)
Calculate the average of conservative variables on traces.
void AddSecondDerivToTrace(const std::size_t nConvectiveFields, const size_t nDim, const size_t nPts, const size_t nTracePts, const NekDouble PenaltyFactor2, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &numDerivFwd, TensorOfArray3D< NekDouble > &numDerivBwd)
Add second derivative term to trace jump (for DDG scheme)
void CalcTraceNumFlux(const NekDouble PenaltyFactor2, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, const TensorOfArray3D< NekDouble > &qfield, const Array< OneD, Array< OneD, NekDouble > > &vFwd, const Array< OneD, Array< OneD, NekDouble > > &vBwd, Array< OneD, int > &nonZeroIndexflux, TensorOfArray3D< NekDouble > &traceflux, Array< OneD, Array< OneD, NekDouble > > &solution_Aver, Array< OneD, Array< OneD, NekDouble > > &solution_jump)
Calculate numerical flux on traces.
NekDouble m_IPSymmFluxCoeff
NekDouble m_IP2ndDervCoeff
NekDouble m_IPPenaltyCoeff
void v_DiffuseCalcDerivative(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfield, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd) override
Diffusion Flux, calculate the physical derivatives.
Array< OneD, Array< OneD, NekDouble > > m_traceJump
TensorOfArray3D< NekDouble > m_wspNumDerivBwd
Workspace for CallTraceNumFlux.
TensorOfArray3D< NekDouble > m_wspNumDerivFwd
LibUtilities::SessionReaderSharedPtr m_session
Array< OneD, Array< OneD, NekDouble > > m_traceAver
Array< OneD, NekDouble > m_tracBwdWeightJump
void v_Diffuse(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd) override
void AddSymmFluxIntegralToCoeff(const std::size_t nConvectiveFields, const size_t nDim, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const int > &nonZeroIndex, TensorOfArray3D< NekDouble > &tracflux, Array< OneD, Array< OneD, NekDouble > > &outarray)
Add symmetric flux integration to field (in coefficient space)
void ConsVarAveJump(const std::size_t nConvectiveFields, const size_t npnts, const Array< OneD, const Array< OneD, NekDouble > > &vFwd, const Array< OneD, const Array< OneD, NekDouble > > &vBwd, Array< OneD, Array< OneD, NekDouble > > &aver, Array< OneD, Array< OneD, NekDouble > > &jump)
void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields) override
void v_DiffuseVolumeFlux(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, int > &nonZeroIndex) override
Diffusion Volume Flux.
void AddDiffusionSymmFluxToCoeff(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, Array< OneD, NekDouble > > &outarray, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd)
void DiffuseTraceSymmFlux(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &VolumeFlux, TensorOfArray3D< NekDouble > &SymmFlux, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd, Array< OneD, int > &nonZeroIndex)
Calculate symmetric flux on traces interface.
Array< OneD, Array< OneD, NekDouble > > m_wspDiff
Workspace for v_Diffusion.
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
void v_DiffuseTraceFlux(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, Array< OneD, NekDouble > > &TraceFlux, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd, Array< OneD, int > &nonZeroIndex) override
Diffusion term Trace Flux.
void CalcTraceSymFlux(const std::size_t nConvectiveFields, const size_t nDim, const Array< OneD, Array< OneD, NekDouble > > &solution_Aver, Array< OneD, Array< OneD, NekDouble > > &solution_jump, Array< OneD, int > &nonZeroIndexsymm, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &traceSymflux)
Calculate symmetric flux on traces.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< AssemblyMapDG > AssemblyMapDGSharedPtr
std::shared_ptr< InterfaceMapDG > InterfaceMapDGSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< LocTraceToTraceMap > LocTraceToTraceMapSharedPtr
static const NekDouble kNekMachineEpsilon
DiffusionFactory & GetDiffusionFactory()
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
static Array< OneD, NekDouble > NullNekDouble1DArray
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Vabs(int n, const T *x, const int incx, T *y, const int incy)
vabs: y = |x|
void Neg(int n, T *x, const int incx)
Negate x = -x.
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.