53 Array<OneD, MultiRegions::ExpListSharedPtr> pFields)
57 m_session->LoadSolverInfo(
"ShockCaptureType",
62 int nDim = pFields[0]->GetCoordim(0);
63 int nTracePts = pFields[0]->GetTrace()->GetTotPoints();
66 for(i = 0; i < nDim; ++i)
74 const int nConvectiveFields,
75 const Array<OneD, MultiRegions::ExpListSharedPtr> &fields,
76 const Array<
OneD, Array<OneD, NekDouble> > &inarray,
77 Array<
OneD, Array<OneD, NekDouble> > &outarray)
79 int nBndEdgePts, i, j, k;
80 int nDim = fields[0]->GetCoordim(0);
81 int nPts = fields[0]->GetTotPoints();
82 int nCoeffs = fields[0]->GetNcoeffs();
83 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
85 Array<OneD, NekDouble> qcoeffs(nCoeffs);
86 Array<OneD, NekDouble> temp (nCoeffs);
88 Array<OneD, Array<OneD, NekDouble> > fluxvector(nDim);
90 Array<OneD, Array<OneD, NekDouble> > tmp(nConvectiveFields);
92 Array<OneD, Array<OneD, Array<OneD, NekDouble> > > flux (nDim);
93 Array<OneD, Array<OneD, Array<OneD, NekDouble> > > qfield(nDim);
94 Array<OneD, Array<OneD, Array<OneD, NekDouble> > > qfieldStd(nDim);
96 for (j = 0; j < nDim; ++j)
99 Array<OneD, Array<OneD, NekDouble> >(nConvectiveFields);
101 Array<OneD, Array<OneD, NekDouble> >(nConvectiveFields);
103 Array<OneD, Array<OneD, NekDouble> >(nConvectiveFields);
105 for (i = 0; i < nConvectiveFields; ++i)
107 qfield[j][i] = Array<OneD, NekDouble>(nPts, 0.0);
108 qfieldStd[j][i] = Array<OneD, NekDouble>(nPts, 0.0);
109 flux[j][i] = Array<OneD, NekDouble>(nTracePts, 0.0);
113 for (k = 0; k < nDim; ++k)
115 fluxvector[k] = Array<OneD, NekDouble>(nPts, 0.0);
123 for (j = 0; j < nDim; ++j)
125 for (i = 0; i < nConvectiveFields; ++i)
127 fields[i]->IProductWRTDerivBase(j, inarray[i], qcoeffs);
129 fields[i]->AddTraceIntegral (flux[j][i], qcoeffs);
130 fields[i]->SetPhysState (
false);
131 fields[i]->MultiplyByElmtInvMass(qcoeffs, qcoeffs);
132 fields[i]->BwdTrans (qcoeffs, qfield[j][i]);
141 Array<OneD, NekDouble> muvar(nPts, 0.0);
144 int numConvFields = nConvectiveFields;
148 numConvFields = nConvectiveFields - 1;
151 for (j = 0; j < nDim; ++j)
153 for (i = 0; i < numConvFields; ++i)
155 Vmath::Vmul(nPts,qfield[j][i],1,muvar,1,qfield[j][i],1);
159 Array<OneD, NekDouble> FwdMuVar(nTracePts, 0.0);
160 Array<OneD, NekDouble> BwdMuVar(nTracePts, 0.0);
162 fields[0]->GetFwdBwdTracePhys(muvar,FwdMuVar,BwdMuVar);
164 int nBndRegions = fields[0]->GetBndCondExpansions().
168 for (
int i = 0; i < nBndRegions; ++i)
171 int nBndEdges = fields[0]->
172 GetBndCondExpansions()[i]->GetExpSize();
176 for (
int e = 0; e < nBndEdges ; ++e)
178 nBndEdgePts = fields[0]->GetBndCondExpansions()[i]
179 ->GetExp(e)->GetTotPoints();
181 int id2 = fields[0]->GetTrace()->GetPhys_Offset(
182 fields[0]->GetTraceMap()
183 ->GetBndCondTraceToGlobalTraceMap(cnt++));
185 for (
int k = 0; k < nBndEdgePts; ++k)
187 BwdMuVar[id2+k] = 0.0;
192 for(i = 0; i < numConvFields; ++i)
194 for(
int k = 0; k < nTracePts; ++k)
197 0.5 * (FwdMuVar[k] + BwdMuVar[k]) * flux[0][i][k];
202 for (i = 0; i < nConvectiveFields; ++i)
204 tmp[i] = Array<OneD, NekDouble>(nCoeffs, 0.0);
206 for (j = 0; j < nDim; ++j)
209 fields[i]->IProductWRTDerivBase(j, fluxvector[j], qcoeffs);
210 Vmath::Vadd(nCoeffs, qcoeffs, 1, tmp[i], 1, tmp[i], 1);
215 fields[i]->AddTraceIntegral (flux[0][i], tmp[i]);
216 fields[i]->SetPhysState (
false);
217 fields[i]->MultiplyByElmtInvMass(tmp[i], tmp[i]);
218 fields[i]->BwdTrans (tmp[i], outarray[i]);
223 const Array<OneD, MultiRegions::ExpListSharedPtr> &fields,
224 const Array<
OneD, Array<OneD, NekDouble> > &ufield,
225 Array<
OneD, Array<
OneD, Array<OneD, NekDouble> > > &uflux)
228 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
229 int nvariables = fields.num_elements();
230 int nDim = uflux.num_elements();
232 Array<OneD, NekDouble > Fwd (nTracePts);
233 Array<OneD, NekDouble > Bwd (nTracePts);
234 Array<OneD, NekDouble > Vn (nTracePts, 0.0);
235 Array<OneD, NekDouble > fluxtemp(nTracePts, 0.0);
238 for(i = 0; i < nDim; ++i)
247 for (j = 0; j < nDim; ++j)
249 for (i = 0; i < nvariables ; ++i)
252 fields[i]->GetFwdBwdTracePhys(ufield[i], Fwd, Bwd);
262 fields[i]->GetTrace()->Upwind(Vn,
274 if(fields[0]->GetBndCondExpansions().num_elements())
300 const Array<OneD, MultiRegions::ExpListSharedPtr> &fields,
302 const Array<OneD, const NekDouble> &ufield,
303 Array<OneD, NekDouble> &penaltyflux)
308 int nBndEdgePts, nBndEdges;
310 int nBndRegions = fields[var]->GetBndCondExpansions().num_elements();
311 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
312 Array<OneD, NekDouble > uplus(nTracePts);
314 fields[var]->ExtractTracePhys(ufield, uplus);
315 for (i = 0; i < nBndRegions; ++i)
318 nBndEdges = fields[var]->
319 GetBndCondExpansions()[i]->GetExpSize();
322 for (e = 0; e < nBndEdges ; ++e)
324 nBndEdgePts = fields[var]->
325 GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints();
328 GetBndCondExpansions()[i]->GetPhys_Offset(e);
330 id2 = fields[0]->GetTrace()->
331 GetPhys_Offset(fields[0]->GetTraceMap()->
332 GetBndCondTraceToGlobalTraceMap(cnt++));
335 if (fields[var]->GetBndConditions()[i]->
340 GetBndCondExpansions()[i]->
342 &penaltyflux[id2], 1);
345 else if ((fields[var]->GetBndConditions()[i])->
350 &penaltyflux[id2], 1);
359 const Array<OneD, MultiRegions::ExpListSharedPtr> &fields,
360 const Array<
OneD, Array<OneD, NekDouble> > &ufield,
361 Array<
OneD, Array<
OneD, Array<OneD, NekDouble> > > &qfield,
362 Array<
OneD, Array<OneD, NekDouble> > &qflux)
365 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
366 int nvariables = fields.num_elements();
367 int nDim = qfield.num_elements();
370 Array<OneD, NekDouble > Fwd(nTracePts);
371 Array<OneD, NekDouble > Bwd(nTracePts);
372 Array<OneD, NekDouble > Vn (nTracePts, 0.0);
374 Array<OneD, NekDouble > qFwd (nTracePts);
375 Array<OneD, NekDouble > qBwd (nTracePts);
376 Array<OneD, NekDouble > qfluxtemp(nTracePts, 0.0);
378 Array<OneD, NekDouble > uterm(nTracePts);
391 for(i = 0; i < nDim; ++i)
399 for (i = 0; i < nvariables; ++i)
401 qflux[i] = Array<OneD, NekDouble> (nTracePts, 0.0);
402 for (j = 0; j < nDim; ++j)
405 fields[i]->GetFwdBwdTracePhys(qfield[j][i], qFwd, qBwd);
419 fields[i]->GetTrace()->Upwind(Vn,
429 fields[i]->GetFwdBwdTracePhys(ufield[i], Fwd, Bwd);
436 -1.0 * C11, uterm, 1,
446 if (fields[0]->GetBndCondExpansions().num_elements())
472 const Array<OneD, MultiRegions::ExpListSharedPtr> &fields,
475 const Array<OneD, const NekDouble> &qfield,
476 Array<OneD, NekDouble> &penaltyflux,
480 int nBndEdges, nBndEdgePts;
481 int nBndRegions = fields[var]->GetBndCondExpansions().num_elements();
482 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
484 Array<OneD, NekDouble > uterm(nTracePts);
485 Array<OneD, NekDouble > qtemp(nTracePts);
498 fields[var]->ExtractTracePhys(qfield, qtemp);
500 for (i = 0; i < nBndRegions; ++i)
502 nBndEdges = fields[var]->
503 GetBndCondExpansions()[i]->GetExpSize();
506 for (e = 0; e < nBndEdges ; ++e)
508 nBndEdgePts = fields[var]->
509 GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints();
512 GetBndCondExpansions()[i]->GetPhys_Offset(e);
514 id2 = fields[0]->GetTrace()->
515 GetPhys_Offset(fields[0]->GetTraceMap()->
516 GetBndCondTraceToGlobalTraceMap(cnt++));
520 if(fields[var]->GetBndConditions()[i]->
526 &penaltyflux[id2], 1);
529 else if((fields[var]->GetBndConditions()[i])->
535 GetBndCondExpansions()[i]->
537 &penaltyflux[id2], 1);