PlasCom2  1.0
XPACC Multi-physics simluation application
EulerRHS.H
Go to the documentation of this file.
1 #ifndef __EULER_RHS_H__
2 #define __EULER_RHS_H__
3 
4 #include <limits>
5 #ifdef USE_OMP
6 #include <omp.h>
7 #endif
8 
9 #include "Simulation.H"
10 #include "EulerUtil.H"
11 #include "EulerKernels.H"
12 #include "ViscidUtil.H"
13 #include "ViscidKernels.H"
14 #include "OperatorKernels.H"
15 #include "MetricKernels.H"
16 #include "GridKernels.H"
17 #include "Stencil.H"
18 #include "SATKernels.H"
19 #include "WENO.H"
20 #include "EOS.H"
21 
22 //static const int ALTERNATERHS = 1;
23 static const int EXCHANGEFLUX = 2;
24 static const int EXCHANGEDV = 4;
25 static const int ARTDISS = 8;
26 static const int USEWENO = 16;
27 
28 static const int holeMask = 1 << mask::HOLE;
29 
30 using namespace simulation::domain::boundary::bc;
31 #define CONSTANT_DT 0
32 #define CONSTANT_CFL 1
33 namespace error {
34  static const int DV = 1;
35  static const int TV = 2;
36  static const int VELGRAD = 4;
37  static const int VELDIV = 8;
38  static const int TGRAD = 16;
39  static const int CONCGRAD = 32;
40  static const int TAU = 64;
41  static const int HEATFLUX = 128;
42  static const int AO = 256;
43  static const int XANGE = 512;
44  static const int IFLUX = 1024;
45  static const int VFLUX = 2048;
46  static const int VEFLUX = 4096;
47  static const int BC = 8192;
48 }
49 
50 namespace euler {
51 
54 
56 
57 
58  template<typename GridT, typename StateT, typename OperatorT>
59  class rhs : public simulation::rhs::domain_base<GridT,StateT,OperatorT> {
60 
61  public:
62 
63  typedef GridT GridType;
64  typedef StateT StateType;
65  typedef OperatorT OperatorType;
69  typedef typename rhs_base_t::BCType BCType;
71 
72  using rhs_base_t::globalPtr;
73 
74  public:
75 
76  rhs() : rhs_base_t(), exchangeFlux(true),
77  exchangeDV(false), artificialDissipation(false),useWENO(false)
78  {
79  globalPtr = NULL;
80  };
81 
82 
83  // ===== Main interface functions ====
84 
85  // - First thing to call from outside, sets up grid, halo, and state
86  // Only called once ever
87  int Initialize(GridType &inGrid, StateType &inState, StateType &inParam,
88  OperatorType &inOperator)
89  {
90 
91  tauCounter = 0;
92 
93  if(Init()){
94  std::cout << "EulerRHS:Fatal error: Init failed." << std::endl;
95  return(1);
96  }
97 
98  if(SetGrid(inGrid)){
99  std::cout << "EulerRHS:Fatal error: Set Grid failed." << std::endl;
100  return(2);
101  }
102 
103  if(SetParamState(inParam)){
104  std::cout << "EulerRHS:Fatal error: Set params failed." << std::endl;
105  return(6);
106  }
107 
108  if(globalPtr){
109 #pragma omp master
110  {
111  globalPtr->FunctionEntry("InitializeState");
112  }
113  }
114  if(InitializeState(inState)){
115  std::cout << "EulerRHS:Fatal error: Initialize state failed." << std::endl;
116  return(3);
117  }
118 
119 
120  if(SetTargetState(inState)){
121  if(globalPtr){
122  globalPtr->ErrOut("Target data setup failed.\n");
123  } else {
124  std::cout << "EulerRHS::InitState:Error: Target data setup failed."
125  << std::endl;
126  }
127  return(1);
128  }
129 
130  if(globalPtr){
131 #pragma omp master
132  {
133  globalPtr->FunctionExit("InitializeState");
134  // globalPtr->FunctionEntry("InitMinSpacing");
135  }
136  }
137 
138  // InitMinSpacing();
139 
140  if(globalPtr){
141 #pragma omp master
142  {
143  // globalPtr->FunctionExit("InitMinSpacing");
144  globalPtr->FunctionEntry("HaloSetup");
145  }
146  }
147 
148  if(HaloSetup(inGrid.Halo())){
149  std::cout << "EulerRHS:Fatal error: Halo setup failed." << std::endl;
150  return(4);
151  }
152 
153  if(globalPtr){
154 #pragma omp master
155  {
156  globalPtr->FunctionExit("HaloSetup");
157  globalPtr->FunctionEntry("SetupOperators");
158  }
159  }
160 
161  if(SetupOperators(inOperator)){
162  std::cout << "EulerRHS:Fatal error: Operator setup failed." << std::endl;
163  return(5);
164  }
165  if(globalPtr){
166 #pragma omp master
167  {
168  globalPtr->FunctionExit("SetupOperators");
169  }
170  }
171 
172 
173  // std::cout << "Configured with grid type = " << gridType << std::endl;
174  return(0);
175 
176  };
177 
178  // - First thing to call from outside, sets up grid, halo, and state
179  // Only called once ever
180  int Initialize(GridType &inGrid, StateType &inState, StateType &inParam,
181  StateType &targetState,OperatorType &inOperator)
182  {
183 
184  tauCounter = 0;
185 
186  if(Init()){
187  std::cout << "EulerRHS:Fatal error: Init failed." << std::endl;
188  return(1);
189  }
190 
191  if(SetGrid(inGrid)){
192  std::cout << "EulerRHS:Fatal error: Set Grid failed." << std::endl;
193  return(2);
194  }
195 
196  if(SetParamState(inParam)){
197  std::cout << "EulerRHS:Fatal error: Set params failed." << std::endl;
198  return(6);
199  }
200 
201 
202  if(globalPtr){
203 #pragma omp master
204  {
205  globalPtr->FunctionEntry("InitializeState");
206  }
207  }
208  if(InitializeState(inState)){
209  std::cout << "EulerRHS:Fatal error: Initialize state failed." << std::endl;
210  return(3);
211  }
212 
213  if(SetTargetState(targetState)){
214  if(globalPtr){
215  globalPtr->ErrOut("Target data setup failed.\n");
216  } else {
217  std::cout << "EulerRHS::InitState:Error: Target data setup failed."
218  << std::endl;
219  }
220  return(1);
221  }
222 
223  if(globalPtr){
224 #pragma omp master
225  {
226  globalPtr->FunctionExit("InitializeState");
227  // globalPtr->FunctionEntry("InitMinSpacing");
228  }
229  }
230 
231  // InitMinSpacing();
232 
233  if(globalPtr){
234 #pragma omp master
235  {
236  // globalPtr->FunctionExit("InitMinSpacing");
237  globalPtr->FunctionEntry("HaloSetup");
238  }
239  }
240 
241  if(HaloSetup(inGrid.Halo())){
242  std::cout << "EulerRHS:Fatal error: Halo setup failed." << std::endl;
243  return(4);
244  }
245 
246  if(globalPtr){
247 #pragma omp master
248  {
249  globalPtr->FunctionExit("HaloSetup");
250  globalPtr->FunctionEntry("SetupOperators");
251  }
252  }
253 
254  if(SetupOperators(inOperator)){
255  std::cout << "EulerRHS:Fatal error: Operator setup failed." << std::endl;
256  return(5);
257  }
258  if(globalPtr){
259 #pragma omp master
260  {
261  globalPtr->FunctionExit("SetupOperators");
262  }
263  }
264 
265  // std::cout << "Configured with grid type = " << gridType << std::endl;
266  return(0);
267 
268  };
269 
270  // - Called any time the state/rhs are different, for RK, that's
271  // every substep as each stage has separate storage
272  int SetupRHS(GridType &inGrid, StateType &inState,
273  StateType &rhsState,int myThreadId = 0)
274  {
275 
276 
277  errorCode = 0;
278 
279 #pragma omp master
280  {
281  errorCode = SetHalo(inGrid.Halo());
282  }
283 
284 #pragma omp barrier
285 
286  if(errorCode > 0)
287  return(errorCode);
288 
289 #pragma omp master
290  {
291  errorCode = SetState(inState);
292  }
293 #pragma omp barrier
294 
295  if(errorCode > 0)
296  return(errorCode);
297 
298 #pragma omp master
299  {
300  errorCode = SetRHSState(rhsState);
301  }
302 
303 #pragma omp barrier
304 
305  if(errorCode > 0)
306  return(errorCode);
307 
308  return(0);
309 
310  };
311 
312  // main call to get RHS (SetupRHS needs to have been called first)
313  int PrepareBuffers(int threadId)
314  {
315 
316  {
317  std::vector<size_t>
318  &fortranBufferInterval(fortranBufferIntervals[threadId]);
319 
320  // Zero the RHS buffers
321  if(globalPtr){
322 #pragma omp barrier
323 #pragma omp master
324  {
325  globalPtr->FunctionEntry("ZeroRHS");
326  }
327  }
328 
329  double zero = 0.0;
330  for(int iEquation = 0;iEquation < numEquations;iEquation++){
332  (&numDim,&numPointsBuffer,&bufferSizes[0],
333  &fortranBufferInterval[0],&zero,myRHSBuffers[iEquation]);
334 
336  if(iEquation == 0){
338  (&numDim,&numPointsBuffer,&bufferSizes[0],
339  &fortranBufferInterval[0],&zero,viscidFluxBuffers[iEquation]);
340  }
341 
342  }
343 
344  if(globalPtr){
345 #pragma omp barrier
346 #pragma omp master
347  {
348  globalPtr->FunctionExit("ZeroRHS");
349  }
350  }
351  }
352  return(0);
353  };
354 
355  int RHS(int threadId)
356  {
357 
358  PrepareBuffers(threadId);
359 
360  // Calculate DV locally (exchange if !exchangeFlux)
361  // (p,T), 1/rho, v, e
362  if(ComputeDV(threadId))
363  return(error::DV);
364 
365  if(refRe > 0){
366 
367  // Calculate TV locally (exchange if !exchangeFlux)
368  // mu, lambda, k ...
370  if(ComputeTV(threadId))
371  return(error::TV);
372  }
373  if(refRe > 0 || artificialDissipation){
374 
375  if(ComputeVelGrad(threadId))
376  return(error::VELGRAD);
377 
378  if(artificialDissipation){
379  if(ComputeVelDiv(threadId))
380  return(error::VELDIV);
381  }
382 
383  if(ComputeStressTensor(threadId))
384  return(error::TAU);
385 
386  if(ComputeTemperatureGrad(threadId))
387  return(error::TGRAD);
388 
389  if(numScalar > 0){
390  if(ComputeConcentrationGrad(threadId)){
391  return(error::CONCGRAD);
392  }
393  }
394  // Calculates heat flux (-q_i)
395  if(ComputeHeatFlux(threadId))
396  return(error::HEATFLUX);
397 
398  // Computes Q_i = -q_i + (v_j * tau_i_j)
399  // stored in heatFluxBuffer
400  if(ComputeViscidEnergyFlux(threadId))
401  return(error::VEFLUX);
402  }
403 
404 
405  double m1 = -1.0;
407  // Jacobian can be applied in one fell swoop for uniform grids
408  std::vector<double> &gridJacobian(gridPtr->Jacobian());
409  m1 *= gridJacobian[0];
410  }
411 
412  // For each spatial dimension (iDim):
413  for(int iDim = 0;iDim < numDim;iDim++){
414 
415  // Populates inviscidFluxBuffer
416  if(InviscidFlux(iDim,threadId))
417  return(error::IFLUX);
418 
419 
420  // Populates viscidFluxBuffer
421  if(refRe > 0){
422  if(ViscousFlux(iDim,threadId))
423  return(error::VFLUX);
424  }
425 
426  if(useWENO){
427  // Exchange states
428  if(ExchangeState(threadId))
429  return(error::XANGE);
430 
431  // Exchange fluxes
432  if(ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId))
433  return(error::XANGE);
434 
435  int wenoStatus = ApplyWENO(iDim,threadId);
436 
437  if(wenoStatus > 0){
438  // process some WENO error
439 #pragma omp master
440  {
441  if(globalPtr){
442  std::ostringstream statusMessage;
443  statusMessage << "ApplyWENO returned error code ("
444  << wenoStatus << "), exiting."
445  << std::endl;
446  globalPtr->StdOut(statusMessage.str());
447  pcpp::io::RenewStream(statusMessage);
448  }
449  }
450  // returns error status to caller
451  return(wenoStatus);
452  }
453 
454  // Sum WENO version of dFluxBuffer to RHS [note use of (m1) uniform gridJac]
455  AccumulateToRHS(m1,dFluxBuffer,threadId);
456 
457  if(refRe > 0){ // update RHS with viscous part
458  if(exchangeFlux){ // exchange flux if required
459  if(ExchangeBuffer(fluxMessageId,numEquations,viscidFluxBuffer,threadId))
460  return(error::XANGE);
461  }
462  if(ApplyOperator(iDim,numEquations,viscidFluxBuffer,dFluxBuffer,threadId,true))
463  return(error::AO);
464  // Sum viscous version of dFluxBuffer to RHS [" note above]
465  double m2 = -1.0*m1;
466  AccumulateToRHS(m2,dFluxBuffer,threadId,true);
467  }
468  } else { // no WENO
469  if (refRe > 0) { // add viscous flux to inviscid flux
470  AccumulateViscousFluxes(-1.0,viscidFluxBuffers,inviscidFluxBuffers,threadId,!exchangeFlux);
471  }
472  if(exchangeFlux){ // exchange flux if required
473  if(ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId))
474  return(error::XANGE);
475  }
476 
477 
478  if(ApplyOperator(iDim,numEquations,inviscidFluxBuffer,dFluxBuffer,threadId))
479  return(error::AO);
480 
481  // Sum inviscid+viscous version of dFluxBuffer to RHS [" note above]
482  AccumulateToRHS(m1,dFluxBuffer,threadId);
483 
484  } // no weno
485 
486 
487  } // Loop over spatial dimensions
488 
489  if(gridType > simulation::grid::UNIRECT){ // apply Jacobian if necessary
490  GridScaleRHS(threadId);
491  }
492 
493  // ------- Process other sources ---------
494  // 1. boundary sources
495  if(globalPtr){
496 #pragma omp barrier
497 #pragma omp master
498  {
499  globalPtr->FunctionEntry("HandleBCs");
500  }
501  }
502  int returnCode = HandleBoundaryConditions(threadId);
503  if(globalPtr){
504 #pragma omp barrier
505 #pragma omp master
506  {
507  globalPtr->FunctionExit("HandleBCs");
508  }
509  }
510  if(returnCode > 0)
511  return(error::BC);
512 
513 
514 
515  // 2. other sources
516  returnCode = HandleSources(threadId);
517 
518 
519  if(returnCode > 0)
520  return(returnCode+200);
521 
522 #pragma omp barrier
523  return(0);
524  };
525 
526  // === Secondary interface/wrapper functions =====
527 
528  // Computes dFluxBuffer using WENO reconstruction on fluxBuffer
529  //
530  // Inputs/Outputs
531  // iDim -- Dimension along which to operate
532  // threadId -- OpenMP thread number
533  int ApplyWENO(int iDim, int threadId) {
534 #pragma omp barrier
535  if(globalPtr){
536 #pragma omp master
537  {
538  globalPtr->FunctionEntry("ApplyWENO");
539  }
540  }
541 
542  int winWidth = coeffsWENO.hiAll - coeffsWENO.loAll + 1;
543 
544  double fluxWindow[winWidth*numEquations];
545  double projFluxWindow[winWidth*numEquations];
546  double projFluxReconst[numEquations];
547 
548  double stateL[numEquations];
549  double stateR[numEquations];
550  double deltaState[numEquations];
551  double projDeltaState[numEquations];
552  double fluxL[numEquations];
553  double fluxR[numEquations];
554 
555  double tmat[numEquations*numEquations];
556  double tinv[numEquations*numEquations];
557  double lambda[numEquations*numEquations];
558  double lambdaL[numEquations*numEquations];
559  double lambdaR[numEquations*numEquations];
560  double normVec[numDim];
561  for (int i=0; i<numDim; i++) {
562  if (i == iDim) normVec[i] = 1;
563  else normVec[i] = 0;
564  }
565 
566  const std::vector<pcpp::IndexIntervalType>
567  &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
568 
569  const pcpp::IndexIntervalType &regionInterval(threadIntervals[threadId]);
570 
572  bufferInterval.InitSimple(bufferSizes);
573 
574  int jDim = (iDim + 1)%numDim;
575  int kDim = (iDim + 2)%numDim; // not needed if numDim == 2
576 
577  size_t js = regionInterval[jDim].first;
578  size_t je = regionInterval[jDim].second;
579 
580  // if numDim == 2 we only want the "k" loop to iterate one time
581  size_t ks = 0;
582  size_t ke = 0;
583  if (numDim == 3) {
584  ks = regionInterval[kDim].first;
585  ke = regionInterval[kDim].second;
586  }
587 
588  for (size_t k=ks; k<=ke; k++) {
589  pcpp::IndexIntervalType opInterval(regionInterval);
590 
591  // In the case numDim == 2, kDim == iDim, so we don't want to break
592  // anything by setting opInterval[kDim]
593  if (numDim == 3) {
594  opInterval[kDim].first = k;
595  opInterval[kDim].second = k;
596  }
597 
598  for (size_t j=js; j<=je; j++) {
599  opInterval[jDim].first = j;
600  opInterval[jDim].second = j;
601 
602  size_t is = regionInterval[iDim].first;
603  size_t ie = regionInterval[iDim].second;
604  // Note: This routine assumes coeffsWENO.loAll <= 0, coeffsWENO.hiAll >= 0
605  opInterval[iDim].first = is + coeffsWENO.loAll - 1; // -1 because we need to compute WENO flux for left face of leftmost point
606  opInterval[iDim].second = ie + coeffsWENO.hiAll;
607 
608  std::vector<size_t> indices;
609  bufferInterval.GetFlatIndices(opInterval, indices);
610 
611  // setup window with fluxes for i == -1
612  for (int loc=0; loc<winWidth; loc++) {
613  for (int eqn=0; eqn<numEquations; eqn++) {
614  // fluxWindow[eqn*winWidth + loc] = fluxBuffer[eqn*numPointsBuffer + indices[loc]];
615  fluxWindow[eqn*winWidth + loc] = inviscidFluxBuffer[eqn*numPointsBuffer + indices[loc]];
616  }
617  }
618 
619  // ii = index into indices, not necessarily falling between is and ie
620  for (size_t ii=-coeffsWENO.loAll; ii<indices.size()-coeffsWENO.hiAll; ii++) {
621  // get left and right state vectors
622  for (int eqn=0; eqn<numEquations; eqn++) {
623  stateL[eqn] = myStateBuffers[eqn][indices[ii]];
624  stateR[eqn] = myStateBuffers[eqn][indices[ii+1]];
625  deltaState[eqn] = stateR[eqn] - stateL[eqn];
626  }
627 
628  // First use tmat, tinv as temp buffers to get eigenvalues of
629  // Jacobians evaluated at left and right states (needed for
630  // entropy fix computation)
631  double gamma = eosPtr->GetGamma();
632  FC_MODULE(satutil,sat_form_roe_matrices,SATUTIL,SAT_FORM_ROE_MATRICES)
633  (&numDim, &stateL[0], &stateL[0], &gamma, &normVec[0], &tmat[0], &tinv[0], &lambdaL[0]);
634  FC_MODULE(satutil,sat_form_roe_matrices,SATUTIL,SAT_FORM_ROE_MATRICES)
635  (&numDim, &stateR[0], &stateR[0], &gamma, &normVec[0], &tmat[0], &tinv[0], &lambdaR[0]);
636 
637  // Now fill tmat, tinv, lambda with Roe eigensystem from
638  // intermediate state
639  FC_MODULE(satutil,sat_form_roe_matrices,SATUTIL,SAT_FORM_ROE_MATRICES)
640  (&numDim, &stateL[0], &stateR[0], &gamma, &normVec[0], &tmat[0], &tinv[0], &lambda[0]);
641 
642  WENO::Project(numEquations, winWidth, &tinv[0], &fluxWindow[0], &projFluxWindow[0]);
643 
644  // setup for entropy fix
645  WENO::Project(numEquations, 1, &tinv[0], &deltaState[0], &projDeltaState[0]);
646  double eta = WENO::EntropyFixEta(numEquations, &lambdaL[0], &lambdaR[0]);
647 
648  for (int eqn=0; eqn<numEquations; eqn++) {
649  int diag = eqn*(numEquations+1); // get diagonal element of lambda matrix
650  int group = (1 + (int) copysign(1.0, lambda[diag]))/2;
651 
652  int startLoc = coeffsWENO.LoGroup(group) - coeffsWENO.loAll;
653  WENO::ReconstPointVal(&projFluxWindow[eqn*winWidth + startLoc], coeffsWENO, group, projFluxReconst[eqn]);
654 
656  double lambdaAbs = std::abs(lambda[diag]);
657  double entropyFix = (eta > lambdaAbs ? 0.5*(eta - lambdaAbs) : 0);
658  entropyFix *= projDeltaState[eqn];
659 
660  //if (entropyFix > 0) {
661  // std::cout << "eta = " << eta << std::endl;
662  // std::cout << "lambdaAbs = " << lambdaAbs << std::endl;
663  // std::cout << "projDeltaState[" << eqn << "] = " << projDeltaState[eqn] << std::endl;
664  // std::cout << "entropyFix[" << eqn << "] = " << entropyFix << std::endl;
665  //}
666 
667  projFluxReconst[eqn] -= entropyFix;
668  }
669 
670  WENO::Project(numEquations, 1, &tmat[0], &projFluxReconst[0], &fluxR[0]);
671 
672  for (int eqn=0; eqn<numEquations && ii > -coeffsWENO.loAll; eqn++) {
673  dFluxBuffer[eqn*numPointsBuffer + indices[ii]] = fluxR[eqn] - fluxL[eqn];
674  }
675 
676  // shift fluxWindow to right
677  for (int loc=1; loc<winWidth; loc++) {
678  for (int eqn=0; eqn<numEquations; eqn++) {
679  int currIndex = eqn*winWidth + loc;
680  int newIndex = eqn*winWidth + (loc-1);
681  fluxWindow[newIndex] = fluxWindow[currIndex];
682  }
683  }
684 
685  // copy new values into fluxWindow
686  for (int eqn=0; ((eqn<numEquations) && (ii < (indices.size()-coeffsWENO.hiAll-1))); eqn++) {
687  // fluxWindow[eqn*winWidth + (winWidth-1)] = fluxBuffer[eqn*numPointsBuffer + indices[ii+coeffsWENO.hiAll+1]];
688  fluxWindow[eqn*winWidth + (winWidth-1)] = inviscidFluxBuffer[eqn*numPointsBuffer + indices[ii+coeffsWENO.hiAll+1]];
689  }
690 
691  for (int eqn=0; eqn<numEquations; eqn++) {
692  fluxL[eqn] = fluxR[eqn];
693  }
694 
695  } // loop over points in iDim
696  } // loop over points in jDim
697  } // loop over points in kDim
698 
699 #pragma omp barrier
700  if(globalPtr){
701 #pragma omp master
702  {
703  globalPtr->FunctionExit("ApplyWENO");
704  }
705  }
706 
707  return 0;
708  };
709 
712  int ArtificialDissipation(int threadId)
713  {
714  size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
715  std::vector<double> &gridMetric(gridPtr->Metric());
716  std::vector<double> &gridJacobian(gridPtr->Jacobian());
717 
718 #pragma omp barrier
719  if(globalPtr){
720 #pragma omp master
721  {
722  globalPtr->FunctionEntry("ArtificialDissipation");
723  }
724  }
725 
726  double dilRamp = 10.0;
727  double sigmaDil = inputSigmaDil;
728  double sigmaDiss = inputSigma;
729  double dilCutoff = -1.5;
730 
731  FC_MODULE(satutil,dissipationweight,SATUTIL,DISSIPATIONWEIGHT)
732  (&numDim,&bufferSizes[0],&numPointsBuffer,dOpInterval,&sigmaDiss,
733  &sigmaDil,&dilRamp,&dilCutoff,velDiv,sigmaDissipation);
734 
735  // Communicate RHS
736  for(int iDim = 0;iDim < numDim;iDim++){
737 
738  int dissDir = iDim + 1;
739 
740  // Get Ram's alpha weight
741  FC_MODULE(metricops,alphaweight,METRICOPS,ALPHAWEIGHT)
742  (&numDim,&numPointsBuffer,&bufferSizes[0],dOpInterval,
743  &gridType,&gridMetric[0],&dissDir,alphaDissipation);
744 
745  // Copy State into fluxBuffer
747  for(int iEquation= 0;iEquation < numEquations;iEquation++){
748 
749  double *iFlux = &inviscidFluxBuffer[iEquation*numPointsBuffer];
750  double *stateBuf = myStateBuffers[iEquation];
751 
752 
754  (&numDim,&numPointsBuffer,&bufferSizes[0],dOpInterval,
755  stateBuf,iFlux);
756  }
757 
758  ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId);
759 
760 #pragma omp barrier
761 
762  // Apply dissipation operator on state component:
763  ApplyDissipationOperator(iDim,numEquations,inviscidFluxBuffer,dFluxBuffer,false,threadId);
764 
765  for(int iEquation= 0;iEquation < numEquations;iEquation++){
766 
767  double *dFlux = &dFluxBuffer[iEquation*numPointsBuffer];
768  double *iFlux = &inviscidFluxBuffer[iEquation*numPointsBuffer];
769  // Repack the inviscidFluxBuffer by
770  // performing R. Vishnampet's metric-based weighting:
771  // ... Malpha=sqrt(M_{alpha,i} * M_{alpha,i}) ; alpha=dir
772  // ... iFlux = alphaDissipation * dFlux
774  (&numDim,&numPointsBuffer,&bufferSizes[0],dOpInterval,alphaDissipation,
775  dFlux,iFlux);
776  }
777 
778  // Exchange inviscidFluxBuffer for stencil op
779  ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId);
780 
781 #pragma omp barrier
782 
783  // Apply split operator on inviscidFluxBuffer:
784  ApplyDissipationOperator(iDim,numEquations,inviscidFluxBuffer,dFluxBuffer,true,threadId);
785 
786  // Update RHS
787  for(int iEquation= 0;iEquation < numEquations;iEquation++){
788 
789  double *dFlux = &dFluxBuffer[iEquation*numPointsBuffer];
790  double *rhsPtr = myRHSBuffers[iEquation];
791 
793  (&numDim,&numPointsBuffer,&bufferSizes[0],dOpInterval,
794  sigmaDissipation,dFlux,rhsPtr);
795 
796  }
797 
798  } // Loop over spatial dimensions
799 #pragma omp barrier
800  {
801  if(globalPtr){
802 #pragma omp master
803  globalPtr->FunctionExit("ArtificialDissipation");
804  }
805  }
806  return(0);
807  }; // Artificial dissipation
808 
809  // No sources (yet)
810  int HandleSources(const pcpp::IndexIntervalType &regionInterval)
811  {return(0);};
812 
813  // No sources (yet)
814  int HandleSources(int myThreadId){
815  int returnCode = 0;
816 
817  if(artificialDissipation){
818  returnCode = ArtificialDissipation(myThreadId);
819  }
820 
821  return(0);
822  };
823 
824 
825  int HandleBoundaryConditions(int threadId)
826  {
828 
829  // note: profile timers cannot be safely used here
830  // due to thread-specific processing performed in this
831  // routine. uncomment bc timers below only for problems
832  // designed to properly measure BC performance.
833 
834  if(!domainBCsPtr)
835  return(0);
836  else if (!subRegionsPtr || !domainBoundariesPtr)
837  return(1);
838 
839  std::vector<BoundaryType> &domainBoundaries(*domainBoundariesPtr);
840  std::vector<BCType> &domainBCs(*domainBCsPtr);
841  std::vector<GridRegionType> &gridRegions(*subRegionsPtr);
842  std::vector<double> &gridMetric(gridPtr->Metric());
843  std::vector<double> &gridJacobian(gridPtr->Jacobian());
844 
845  int numBCs = domainBCs.size();
846  int numGridRegions = gridRegions.size();
847  int numDomainBoundaries = domainBoundaries.size();
848 
849  if(numBCs == 0)
850  return(0);
851  if(numDomainBoundaries == 0)
852  return(0);
853 
854  typename std::vector<BoundaryType>::iterator dbIt = domainBoundaries.begin();
855 
856  std::vector<double> gasParams(6,0.0);
857 
858  double gamma = eosPtr->GetGamma();
859  gasParams[0] = refRe;
860  gasParams[1] = gamma;
861  gasParams[2] = specGasConst;
862  gasParams[3] = temperatureScale;
863  gasParams[4] = refSndSpd;
864  gasParams[5] = std::max(gamma/refPr,5.0/3.0);
865 
866  while(dbIt != domainBoundaries.end()){
867 
868  BoundaryType &domainBoundary(*dbIt++);
869  GridRegionType &gridRegion(gridRegions[domainBoundary.GridRegionID()]);
870  std::vector<size_t>
871  &threadPartBufferIndices(gridRegion.threadPartitionBufferIndices[threadId]);
872  size_t numBoundaryPoints = threadPartBufferIndices.size();
873 
874  if(numBoundaryPoints > 0){ // this rank/thread owns part of the boundary
875 
876  BCType &boundaryCondition(domainBoundary.BC());
877  // unique int id for bc
878  int bcType = boundaryCondition.BCType();
879 
880  if(bcType == navierstokes::HOLE)
881  continue;
882 
883  int normalDir = gridRegion.normalDirection;
884  pcpp::IndexIntervalType &regionInterval(gridRegion.regionInterval);
885  std::vector<size_t> regionSizes(regionInterval.Sizes());
886  size_t numPointsRegion = regionInterval.NNodes();
887  pcpp::IndexIntervalType &regionOpBufferInterval(gridRegion.threadPartitionBufferIntervals[threadId]);
888  pcpp::IndexIntervalType &regionOpInterval(gridRegion.threadPartitionIntervals[threadId]);
889 
890  // bc-associated parameters from input file
892  StateType &bcParamState(boundaryCondition.Params());
893  double *bcParams = bcParamState.template GetFieldBuffer<double>("Numbers");
894  int *bcFlags = bcParamState.template GetFieldBuffer<int>("Flags");
895 
896  const std::string &bcName(boundaryCondition.BCName());
897  const std::string &regionName(gridRegion.regionName);
898  const std::string &boundaryName(domainBoundary.Name());
899 
900  // std::cout << "bcName " << bcName << " regionName " << regionName << " boundaryName "
901  // << boundaryName << " bcType " << bcType << std::endl;
902  // int numParams = bcParamState.GetFieldMetaData("Numbers").ncomp;
903  // std::cout << "&bcParams = " << bcParams << std::endl
904  // << "Number of parameters: " << numParams << std::endl;
905  // for(int i=0; i<numParams; i++){
906  // std::cout << "i " << i << " bcParams[i] " << bcParams[i] << std::endl;
907  // }
908 
909  switch(bcType) {
910 
912  // ** see timer note above
913  // globalPtr->FunctionEntry("Sponge");
914  if(normalDir != 0){
915  // bcParams[] = {spongeAmplitude,spongePower}
916  navierstokes::LinearSponge(bufferSizes,normalDir,regionInterval,regionOpInterval,
917  regionOpBufferInterval,bcParams,bcFlags,
918  numEquations,myStateBuffers,targetStateBuffers,myRHSBuffers);
919  } else {
920  // Sponge blobs are Gaussian
921  // bcParams[] = {spongeAmplitude,spongeWidth}
922  navierstokes::SpongeZone(bufferSizes,normalDir,regionInterval,regionOpInterval,
923  regionOpBufferInterval,bcParams,bcFlags,iMask,holeMask,
924  numEquations,myStateBuffers,targetStateBuffers,myRHSBuffers);
925  }
926  // globalPtr->FunctionExit("Sponge");
927  break;
928 
930  // globalPtr->FunctionEntry("Farfield");
931  bcParams[2] = boundaryWeight;
932  // Call SAT Farfield kernel
933  FC_MODULE(satutil,farfield,SATUTIL,FARFIELD)
934  ( &numDim,&bufferSizes[0],&numPointsBuffer,&normalDir,&regionSizes[0],
935  &numPointsRegion,&numBoundaryPoints,&threadPartBufferIndices[0],
936  &gridType,&gridMetric[0],&gridJacobian[0],bcParams,&gasParams[0],
937  rhoPtr,rhoVPtr,rhoEPtr,viscidFluxBuffer,&numScalar,scalarPtr,
938  rhoRHSPtr,rhoVRHSPtr,rhoERHSPtr,scalarRHSPtr,
939  rhoTargetPtr,rhoVTargetPtr,rhoETargetPtr,scalarTargetPtr);
940 
941  // globalPtr->FunctionExit("Farfield");
942  break;
943 
945  if(refRe > 0){
946  if(numScalar > 0) {
947  std::ostringstream errMsg;
948  errMsg << "EulerRHS::HandleBoundaryConditions: Error SAT_NOSLIP_ISOTHERMAL "
949  << "is not implemented for scalar transport. Aborting." << std::endl;
950  if(globalPtr){
951  globalPtr->StdOut(errMsg.str());
952  } else {
953  std::cout << errMsg.str();
954  }
955  return(1);
956  }
957  bcParams[3] = boundaryWeight;
958 
959  // Call SAT NOSLIP of PlasComCM
960  FC_MODULE(satutil,noslip_isothermal,SATUTIL,NOSLIP_ISOTHERMAL)
961  ( &numDim,&bufferSizes[0],&numPointsBuffer,&normalDir,&regionSizes[0],
962  &numPointsRegion,&numBoundaryPoints,&threadPartBufferIndices[0],&gridType,
963  &gridMetric[0],&gridJacobian[0],&bcParams[0],&gasParams[0],rhoPtr,rhoVPtr,
964  rhoEPtr,&numScalar,scalarPtr,rhoRHSPtr,rhoVRHSPtr,rhoERHSPtr,
965  scalarRHSPtr,rhoTargetPtr,rhoVTargetPtr,rhoETargetPtr,
966  scalarTargetPtr,muPtr,lambdaPtr);
967 
968  } else {
969 
970  std::ostringstream errMsg;
971  errMsg << "EulerRHS::HandleBoundaryConditions:Error: SAT_NOSLIP_ISOTHERMAL "
972  << "not a valid BC for inviscid (Re = 0) flows. Aborting." << std::endl;
973  if(globalPtr){
974  globalPtr->StdOut(errMsg.str());
975  } else {
976  std::cout << errMsg.str();
977  }
978  return(1);
979  }
980 
981  break;
983  bcParams[1] = boundaryWeight;
984 
985  FC_MODULE(satutil,slip_adiabatic,SATUTIL,SLIP_ADIABATIC)
986  ( &numDim,&bufferSizes[0],&numPointsBuffer,&normalDir,&regionSizes[0],
987  &numPointsRegion,&numBoundaryPoints,&threadPartBufferIndices[0],&gridType,
988  &gridMetric[0],&gridJacobian[0],bcParams,&gasParams[0],rhoPtr,rhoVPtr,
989  rhoEPtr,&numScalar,scalarPtr,rhoRHSPtr,rhoVRHSPtr,rhoERHSPtr,
990  scalarRHSPtr,rhoTargetPtr,rhoVTargetPtr,rhoETargetPtr,scalarTargetPtr);
991 
992  break;
993  default:
994  std::ostringstream errMsg;
995  errMsg << "EulerRHS::HandleBoundaryConditions:Error: Could not resolve BC("
996  << bcName << ") = " << bcType << ". Aborting." << std::endl;
997  if(globalPtr){
998  globalPtr->StdOut(errMsg.str());
999  } else {
1000  std::cout << errMsg.str() << std::endl;
1001  }
1002  return(1);
1003  break;
1004 
1005  }
1006 
1007  }
1008  }
1009 
1010  return(0);
1011 
1012  };
1013 
1014  int ApplyOperator(int dDir,int numComponents,double *uBuffer,double *duBuffer,
1015  int threadId,bool skipDensity=false)
1016  {
1017 
1018  size_t dirOffset = dDir*numPointsBuffer;
1019  size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1020 
1021  int one = 1;
1022  dDir++; // forticate direction
1023 
1024 #pragma omp barrier
1025  if(globalPtr){
1026 #pragma omp master
1027  {
1028  globalPtr->FunctionEntry("ApplyOperator");
1029  }
1030  }
1031 
1032  int startComponent = 0;
1033  if(skipDensity) startComponent = 1;
1034  // applyoperator does equation-at-a-time
1035  for(int iComp = startComponent;iComp < numComponents;iComp++){
1036  size_t compOffset = iComp*numPointsBuffer;
1038  (&numDim,&bufferSizes[0],&one,&numPointsBuffer,
1039  &dDir,dOpInterval,&numStencils,stencilSizes,
1040  stencilStarts,&numStencilValues,stencilWeights,
1041  stencilOffsets,&stencilConn[dirOffset],
1042  &uBuffer[compOffset],&duBuffer[compOffset]);
1043  }
1044  // applyoperatorv does numComponents (i.e. number of equations)
1045  // loop on the inside
1046  // FC_MODULE(operators,applyoperatorv,OPERATORS,APPLYOPERATORV)
1047  // (&numDim,&bufferSizes[0],&one,&numPointsBuffer,
1048  // &dDir,opInterval,&numStencils,stencilSizes,
1049  // stencilStarts,&numStencilValues,stencilWeights,
1050  // stencilOffsets,&stencilConn[dirOffset],
1051  // &uBuffer[compOffset],&duBuffer[compOffset]);
1052 
1053 #pragma omp barrier
1054  if(globalPtr){
1055 #pragma omp master
1056  {
1057  globalPtr->FunctionExit("ApplyOperator");
1058  }
1059  }
1060 
1061  return(0);
1062  };
1063 
1064  int ApplyDissipationOperator(int dDir,int numComponents,double *uBuffer,double *duBuffer,
1065  bool split = false,int threadId = 0)
1066  {
1067 
1068  size_t dirOffset = dDir*numPointsBuffer;
1069  size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1070 
1071  int one = 1;
1072  dDir++; // forticate direction
1073 
1074 #pragma omp barrier
1075  if(globalPtr){
1076 #pragma omp master
1077  {
1078  globalPtr->FunctionEntry("ApplyDissOperator");
1079  }
1080  }
1081 
1082  int numStencilsDiss = 0;
1083  int *stencilSizesDiss = NULL;
1084  int *stencilStartsDiss = NULL;
1085  int numStencilValuesDiss = 0;
1086  double *stencilWeightsDiss = NULL;
1087  int *stencilOffsetsDiss = NULL;
1088  int *stencilConnDiss = NULL;
1089 
1090  // Assign dissipation stencil data
1091  if(split){
1092  numStencilsDiss = artDissOperatorSplit.numStencils;
1093  stencilSizesDiss = artDissOperatorSplit.stencilSizes;
1094  stencilStartsDiss = artDissOperatorSplit.stencilStarts;
1095  stencilWeightsDiss = artDissOperatorSplit.stencilWeights;
1096  stencilOffsetsDiss = artDissOperatorSplit.stencilOffsets;
1097  stencilConnDiss = artDissConnSplit;
1098  } else {
1099  numStencilsDiss = artDissOperator.numStencils;
1100  stencilSizesDiss = artDissOperator.stencilSizes;
1101  stencilStartsDiss = artDissOperator.stencilStarts;
1102  stencilWeightsDiss = artDissOperator.stencilWeights;
1103  stencilOffsetsDiss = artDissOperator.stencilOffsets;
1104  stencilConnDiss = artDissConn;
1105  }
1106 
1107  // applyoperator does equation-at-a-time
1108  for(int iComp = 0;iComp < numComponents;iComp++){
1109 
1110  size_t compOffset = iComp*numPointsBuffer;
1111 
1113  (&numDim,&bufferSizes[0],&one,&numPointsBuffer,
1114  &dDir,dOpInterval,&numStencilsDiss,stencilSizesDiss,
1115  stencilStartsDiss,&numStencilValuesDiss,stencilWeightsDiss,
1116  stencilOffsetsDiss,&stencilConnDiss[dirOffset],
1117  &uBuffer[compOffset],&duBuffer[compOffset]);
1118  }
1119  // applyoperatorv does numComponents (i.e. number of equations)
1120  // loop on the inside
1121  // FC_MODULE(operators,applyoperatorv,OPERATORS,APPLYOPERATORV)
1122  // (&numDim,&bufferSizes[0],&one,&numPointsBuffer,
1123  // &dDir,opInterval,&numStencils,stencilSizes,
1124  // stencilStarts,&numStencilValues,stencilWeights,
1125  // stencilOffsets,&stencilConn[dirOffset],
1126  // &uBuffer[compOffset],&duBuffer[compOffset]);
1127 
1128 #pragma omp barrier
1129  if(globalPtr){
1130 #pragma omp master
1131  {
1132  globalPtr->FunctionExit("ApplyDissOperator");
1133  }
1134  }
1135 
1136  return(0);
1137  };
1138 
1139  void GridScaleRHS(int threadId){
1140 
1141  if(globalPtr){
1142 #pragma omp barrier
1143 #pragma omp master
1144  {
1145  globalPtr->FunctionEntry("GridScaleRHS");
1146  }
1147  }
1148 
1149  size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1150  std::vector<double> &gridJacobian(gridPtr->Jacobian());
1151 
1152  // if(gridType > simulation::grid::UNIRECT){
1153  for(int iEquation = 0;iEquation < numEquations;iEquation++){
1154  double *rhsPtr = myRHSBuffers[iEquation];
1156  (&numDim,&numPointsBuffer,&bufferSizes[0],dOpInterval,&gridJacobian[0],rhsPtr);
1157  }
1158  // } else {
1159  // for(int iEquation = 0;iEquation < numEquations;iEquation++){
1160  // double *rhsPtr = myRHSBuffers[iEquation];
1161  // FC_MODULE(operators,xax,OPERATORS,XAX)
1162  // (&numDim,&numPointsBuffer,&bufferSizes[0],dOpInterval,&gridJacobian[0],rhsPtr);
1163  // }
1164  // }
1165 
1166  if(globalPtr){
1167 #pragma omp barrier
1168 #pragma omp master
1169  {
1170  globalPtr->FunctionExit("GridScaleRHS");
1171  }
1172  }
1173  };
1174 
1175 
1176  void AccumulateToRHS(double a,double *dfBuffer,int threadId,bool skipDensity = false)
1177  {
1178  if(globalPtr){
1179 #pragma omp barrier
1180 #pragma omp master
1181  {
1182  globalPtr->FunctionEntry("AccumulateRHS");
1183  }
1184  }
1185 
1186  size_t *dOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1187 
1188  // Y = a*X + Y
1189  int startComponent = 0;
1190  if(skipDensity) startComponent = 1;
1191  for(int iComp = startComponent;iComp < numEquations;iComp++){
1193  (&numDim,&numPointsBuffer,&bufferSizes[0],dOpInterval,&a,
1194  &dfBuffer[iComp*numPointsBuffer],myRHSBuffers[iComp]);
1195  }
1196 
1197 
1198  if(globalPtr){
1199 #pragma omp barrier
1200 #pragma omp master
1201  {
1202  globalPtr->FunctionExit("AccumulateRHS");
1203  }
1204  }
1205 
1206  };
1207 
1208 
1209  int ComputeDV(int threadId)
1210  {
1211 
1212  if(globalPtr){
1213 #pragma omp barrier
1214 #pragma omp master
1215  {
1216  globalPtr->FunctionEntry("ComputeDV");
1217  }
1218  }
1219 
1220  // Need non-forticated intervals here
1221  const std::vector<pcpp::IndexIntervalType>
1222  &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1223 
1224  const pcpp::IndexIntervalType &regionInterval(threadIntervals[threadId]);
1225  std::vector<size_t> &fortranOpInterval(fortranPartitionBufferIntervals[threadId]);
1226 
1227  double zero = 0.0;
1228  int returnCode = 0;
1229  // Computed on local partition only
1230  // 1/rho, velocity, internal energy
1231  returnCode = euler::util::ComputeDVBuffer(regionInterval,bufferSizes,
1232  myStateBuffers,dvBuffers);
1233 
1234  // compute pressure and temperature from the eos
1235  returnCode = eosPtr->ComputePressureBuffer(regionInterval,bufferSizes);
1236  returnCode = eosPtr->ComputeTemperatureBuffer(regionInterval,bufferSizes);
1237 
1238  if(!returnCode && exchangeDV){
1239  returnCode = ExchangeDV(threadId);
1240  }
1241 
1242  if(globalPtr){
1243 #pragma omp barrier
1244 #pragma omp master
1245  {
1246  globalPtr->FunctionExit("ComputeDV");
1247  }
1248  }
1249 
1250  return(returnCode);
1251 
1252  };
1253 
1254  int ComputeTV(int threadId)
1255  {
1256  if(globalPtr){
1257 #pragma omp barrier
1258 #pragma omp master
1259  {
1260  globalPtr->FunctionEntry("ComputeTV");
1261  }
1262  }
1263 
1264  // Need non-forticated intervals here
1265  const std::vector<pcpp::IndexIntervalType>
1266  &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1267 
1268  const pcpp::IndexIntervalType &regionInterval(threadIntervals[threadId]);
1269  std::vector<size_t> &fortranOpInterval(fortranPartitionBufferIntervals[threadId]);
1270 
1271  int returnCode = 0;
1272  // Computed on local partition only
1273  if(transportModel == POWER) {
1274  double heatCapacityCp = eosPtr->GetHeatCapacityCp();
1275  returnCode = viscid::util::ComputeTVBufferPower(regionInterval,bufferSizes,
1276  temperaturePtr,tvBuffers,
1277  beta,power,bulkViscFac,heatCapacityCp,refPr);
1278  } else {
1279  std::ostringstream errMsg;
1280  errMsg << "EulerRHS::RHS:Error: Unknown transport model in EulerRHS. Aborting."
1281  << std::endl;
1282  if(globalPtr){
1283  globalPtr->StdOut(errMsg.str());
1284  globalPtr->FunctionExit("ComputeTV");
1285  } else {
1286  std::cout << errMsg.str();
1287  }
1288 
1289  return(1);
1290  }
1291 
1292  if(globalPtr){
1293 #pragma omp barrier
1294 #pragma omp master
1295  {
1296  globalPtr->FunctionExit("ComputeTV");
1297  }
1298  }
1299 
1300  return(returnCode);
1301  };
1302 
1303  int InviscidFlux(int iDim,int threadId)
1304  {
1305  // - Inviscid flux - (local if exchangeFlux,+halos otherwise)
1306 
1307  if(globalPtr){
1308 #pragma omp barrier
1309 #pragma omp master
1310  {
1311  globalPtr->FunctionEntry("InviscidFlux");
1312  }
1313  }
1314 
1315  size_t *fluxOpInterval = NULL;
1316  if(exchangeFlux){
1317  fluxOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1318  } else {
1319  fluxOpInterval = &fortranBufferIntervals[threadId][0];
1320  }
1321 
1322  if(globalPtr){
1323 #pragma omp barrier
1324 #pragma omp master
1325  {
1326  globalPtr->FunctionEntry("ComputeVHat");
1327  }
1328  }
1329 
1330  size_t dirOffset = iDim*numPointsBuffer;
1331  std::vector<double> &gridMetric(gridPtr->Metric());
1332  double *velocity = &velocityPtr[0];
1333  int fluxDim = iDim + 1;
1334 
1335  // 0. Get vHat(iDim) = v * Xi_Hat(iDim)
1336  FC_MODULE(metricops,vhatcomponent,METRICOPS,VHATCOMPONENT)
1337  (&numDim,&numPointsBuffer,&bufferSizes[0],fluxOpInterval,
1338  &gridType,&gridMetric[0],&fluxDim,&velocity[0],velHat);
1339 
1340  if(globalPtr){
1341 #pragma omp barrier
1342 #pragma omp master
1343  {
1344  globalPtr->FunctionExit("ComputeVHat");
1345  globalPtr->FunctionEntry("Flux1D");
1346  }
1347  }
1348 
1349  // 1. get f(iDim,1) = rho*vHat(iDim)
1350  // 2. get f(iDim,n={2,3,4}) = rho*vHat(iDim)*v(n) + p*delta_ij
1351  // 3. get f(iDim,numDim+2) = (rhoE + p)*vHat(iDim)
1352  FC_MODULE(euler,flux1d,EULER,FLUX1D)
1353  (&numDim,&numPointsBuffer,&bufferSizes[0],fluxOpInterval,
1354  &fluxDim,&gridType,&gridMetric[0],rhoPtr,rhoVPtr,rhoEPtr,
1355  &velHat[0],pressurePtr,inviscidFluxBuffer);
1356 
1357 
1358  if(globalPtr){
1359 #pragma omp barrier
1360 #pragma omp master
1361  {
1362  globalPtr->FunctionExit("Flux1D");
1363  }
1364  }
1365 
1366  if(numScalar > 0) {
1367 
1368  if(globalPtr){
1369 #pragma omp barrier
1370 #pragma omp master
1371  {
1372  globalPtr->FunctionEntry("ScalarFlux1D");
1373  }
1374  }
1375 
1376  // 4. get f(iDim,numDim+3:+) = rho*Y_n*vHat(iDim) [scalar advection]
1377  FC_MODULE(euler,scalarflux1d,EULER,SCALARFLUX1D)
1378  (&numDim,&numPointsBuffer,&bufferSizes[0],fluxOpInterval,
1379  &numScalar,scalarPtr,&velHat[0],inviscidFluxBuffers[numDim+2]);
1380 
1381  if(globalPtr){
1382 #pragma omp barrier
1383 #pragma omp master
1384  {
1385  globalPtr->FunctionExit("ScalarFlux1D");
1386  }
1387  }
1388 
1389  }
1390 
1391  if(globalPtr){
1392 #pragma omp barrier
1393 #pragma omp master
1394  {
1395  globalPtr->FunctionExit("InviscidFlux");
1396  }
1397  }
1398 
1399  return(0);
1400  };
1401 
1402  int ComputeVelDiv(int threadId) // assumes velgrad is already computed
1403  {
1404  if(globalPtr){
1405 #pragma omp barrier
1406 #pragma omp master
1407  {
1408  globalPtr->FunctionEntry("ComputeVelDiv");
1409  }
1410  }
1411 
1412  const std::vector<pcpp::IndexIntervalType>
1413  &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1414  const pcpp::IndexIntervalType &regionInterval(threadIntervals[threadId]);
1415  std::vector<size_t> &fortranOpInterval(fortranPartitionBufferIntervals[threadId]);
1416  std::vector<double> &gridMetric(gridPtr->Metric());
1417  std::vector<double> &gridJacobian(gridPtr->Jacobian());
1418 
1419  // Zero the veldiv buffer [kernel used below is of (+=) type]
1420  double zero = 0.0;
1422  (&numDim,&numPointsBuffer,&bufferSizes[0],
1423  &fortranOpInterval[0],&zero,velDiv);
1424 
1425  FC_MODULE(metricops,ijkgradtoxyzdiv,METRICOPS,IJKGRADTOXYZDIV)
1426  (&numDim,&numPointsBuffer,&bufferSizes[0],&fortranOpInterval[0],
1427  &gridType,&gridJacobian[0],&gridMetric[0],velGradBufferPtr,
1428  velDiv);
1429 
1430  if(globalPtr){
1431 #pragma omp barrier
1432 #pragma omp master
1433  {
1434  globalPtr->FunctionExit("ComputeVelDiv");
1435  }
1436  }
1437 
1438  return(0);
1439 
1440  };
1441 
1442  int ComputeScalarGradient(double *scalarData,double *gradData,int threadId = 0,bool communicateData = false)
1443  {
1444  if(globalPtr){
1445 #pragma omp barrier
1446 #pragma omp master
1447  {
1448  globalPtr->FunctionEntry("ComputeScalarGrad");
1449  }
1450  }
1451  const size_t *opInterval = &fortranPartitionBufferIntervals[threadId][0];
1452  std::vector<double> &gridMetric(gridPtr->Metric());
1453  std::vector<double> &gridJacobian(gridPtr->Jacobian());
1454 
1455  if(communicateData){
1456  ExchangeBuffer(scalarMessageId,1,scalarData,threadId);
1457  }
1458 
1459  // calculate d(phi)/d(Xi)_i
1460  for(int i=0;i<numDim;i++){
1461  size_t gradOffset = numPointsBuffer*i;
1462  ApplyOperator(i,1,scalarData,&tempVector[gradOffset],threadId);
1463  }
1464 
1465  FC_MODULE(metricops,gradijktogradxyz,METRICOPS,GRADIJKTOGRADXYZ)
1466  (&numDim,&numPointsBuffer,&bufferSizes[0],opInterval,
1467  &gridType,&gridJacobian[0],&gridMetric[0],tempVector,gradData);
1468 
1469  if(globalPtr){
1470 #pragma omp barrier
1471 #pragma omp master
1472  {
1473  globalPtr->FunctionExit("ComputeScalarGrad");
1474  }
1475  }
1476 
1477  return(0);
1478  };
1479 
1480 
1481  int ComputeVelGrad(int threadId)
1482  {
1483 
1484  if(globalPtr){
1485 #pragma omp barrier
1486 #pragma omp master
1487  {
1488  globalPtr->FunctionEntry("ComputeVelGrad");
1489  }
1490  }
1491 
1492 
1493  // calculate dV_j/d(Xi)_i
1494  for(int i=0;i<numDim;i++){
1495  ApplyOperator(i,numDim,velocityPtr,velGradBuffers[i],threadId);
1496  }
1497 
1498  if(globalPtr){
1499 #pragma omp barrier
1500 #pragma omp master
1501  {
1502  globalPtr->FunctionExit("ComputeVelGrad");
1503  }
1504  }
1505 
1506  return(0);
1507  };
1508 
1509  int ComputeConcentrationGrad(int threadId)
1510  {
1511  if(globalPtr){
1512 #pragma omp barrier
1513 #pragma omp master
1514  {
1515  globalPtr->FunctionEntry("ComputeConcGrad");
1516  }
1517  }
1518  const size_t *opInterval = &fortranPartitionBufferIntervals[threadId][0];
1519 
1520  if(numScalar > 0){
1521  for(int iScalar = 0;iScalar < numScalar;iScalar++){
1522  size_t scalarOffset = iScalar*numPointsBuffer;
1523  size_t scalarGradOffset = numDim*scalarOffset;
1524  // (1) Y = rhom1 * rhoY
1526  (&numDim,&numPointsBuffer,&bufferSizes[0],opInterval,
1527  rhom1Ptr,&scalarPtr[scalarOffset],tempScalar);
1528  // (2) Grad(Y) = J * g_ij * grad(Y)_i (this is a gradient in physical coordinates)
1529  ComputeScalarGradient(tempScalar,&scalarGrad[scalarGradOffset],threadId,true);
1530  //
1531  // ------------------- NOTES -----------
1532  // ** This next kernel (YXY) applies the scalar diffusivities
1533  // to Grad(Y). Please observe the following:
1534  // - The scalarDiffusivity should *include* any nondim or scaling factors
1535  // - ComputeTV or similar should be modified to compute the scalarDiffusivity
1536  // - Until computed, scalarDiffusivity takes value 1.0 or the user-specified
1537  // value from the input parameter (inputDiffusivity)
1538  // - BTW: scalarDiffusivity is synomynous with tvBuffers[3+iScalar]
1539  // - The scalarDiffusivity is applied *in-place* - which means that the
1540  // variable "scalarGrad" now actually contains scalarDiffusivity*Grad(Y).
1541  // -------------------
1542  // (3) X_j = scalarDiffusivity*Grad(Y)
1543  for(int iDim = 0;iDim < numDim; iDim++){
1544  size_t dirOffset = iDim*numPointsBuffer;
1546  (&numDim,&numPointsBuffer,&bufferSizes[0],opInterval,
1547  &scalarDiffusivity[scalarOffset],&scalarGrad[scalarGradOffset+dirOffset]);
1548  }
1549  }
1550  }
1551 
1552  if(globalPtr){
1553 #pragma omp barrier
1554 #pragma omp master
1555  {
1556  globalPtr->FunctionExit("ComputeConcGrad");
1557  }
1558  }
1559  return(0);
1560  };
1561  int ComputeTemperatureGrad(int threadId)
1562  {
1563  if(globalPtr){
1564 #pragma omp barrier
1565 #pragma omp master
1566  {
1567  globalPtr->FunctionEntry("ComputeTempGrad");
1568  }
1569  }
1570 
1571  // Need non-forticated intervals here
1572  const std::vector<pcpp::IndexIntervalType>
1573  &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1574  const pcpp::IndexIntervalType &regionInterval(threadIntervals[threadId]);
1575  std::vector<size_t> &fortranOpInterval(fortranPartitionBufferIntervals[threadId]);
1576 
1577  // calculate dT/dX_j
1578  for(int i=0;i<numDim;i++){
1579  ApplyOperator(i,1,temperaturePtr,temperatureGradBuffers[i],threadId);
1580  }
1581 
1582  if(globalPtr){
1583 #pragma omp barrier
1584 #pragma omp master
1585  {
1586  globalPtr->FunctionExit("ComputeTempGrad");
1587  }
1588  }
1589 
1590  return(0);
1591  };
1592 
1593  int ComputeStressTensor(int threadId)
1594  {
1595  if(globalPtr){
1596 #pragma omp barrier
1597 #pragma omp master
1598  {
1599  globalPtr->FunctionEntry("ComputeStressTensor");
1600  }
1601  }
1602 
1603  const std::vector<pcpp::IndexIntervalType>
1604  &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1605  const pcpp::IndexIntervalType &regionInterval(threadIntervals[threadId]);
1606  std::vector<double> &gridMetric(gridPtr->Metric());
1607  std::vector<double> &gridJacobian(gridPtr->Jacobian());
1608 
1609  int returnCode = viscid::util::ComputeTauBuffer(regionInterval, bufferSizes,
1610  gridType,gridMetric, gridJacobian, refRe,
1611  tvBuffers, velGradBuffers, tauBuffers);
1612 
1613 
1614  if(globalPtr){
1615 #pragma omp barrier
1616 #pragma omp master
1617  {
1618  globalPtr->FunctionExit("ComputeStressTensor");
1619  }
1620  }
1621 
1622  return(0);
1623  };
1624 
1625  int ComputeHeatFlux(int threadId)
1626  {
1627 
1628  if(globalPtr){
1629 #pragma omp barrier
1630 #pragma omp master
1631  {
1632  globalPtr->FunctionEntry("ComputeHeatFlux");
1633  }
1634  }
1635 
1636  const std::vector<pcpp::IndexIntervalType>
1637  &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1638  const pcpp::IndexIntervalType &regionInterval(threadIntervals[threadId]);
1639  std::vector<double> &gridMetric(gridPtr->Metric());
1640  std::vector<double> &gridJacobian(gridPtr->Jacobian());
1641 
1642 
1643  int returnCode = viscid::util::ComputeHeatFluxBuffer(regionInterval, bufferSizes,
1645  tvBuffers, temperatureGradBuffers, heatFluxBuffers);
1646 
1647 
1648 
1649  if(globalPtr){
1650 #pragma omp barrier
1651 #pragma omp master
1652  {
1653  globalPtr->FunctionExit("ComputeHeatFlux");
1654  }
1655  }
1656  return(0);
1657  };
1658 
1659  int ComputeViscidEnergyFlux(int threadId)
1660  {
1661 
1662  if(globalPtr){
1663 #pragma omp barrier
1664 #pragma omp master
1665  {
1666  globalPtr->FunctionEntry("ViscidEnergyFlux");
1667  }
1668  }
1669 
1670  const std::vector<pcpp::IndexIntervalType>
1671  &threadIntervals(gridPtr->ThreadPartitionBufferIntervals());
1672  const pcpp::IndexIntervalType &regionInterval(threadIntervals[threadId]);
1673  const size_t *opInterval = &fortranPartitionBufferIntervals[threadId][0];
1674 
1675  for(int iDim = 0;iDim < numDim;iDim++){
1676 
1677  // Compute Q_i = -q_i + (v_j * tau_i_j)
1678  for(int iVel = 0;iVel < numDim;iVel++){
1679  int tensorIndex = iDim*numDim + iVel;
1680  size_t dirOffset = iVel*numPointsBuffer;
1681 
1683  (&numDim,&numPointsBuffer,&bufferSizes[0],opInterval,
1684  &velocityPtr[dirOffset],tauBuffers[tensorIndex],heatFluxBuffers[iDim]);
1685 
1686  }
1687  }
1688 
1689  if(globalPtr){
1690 #pragma omp barrier
1691 #pragma omp master
1692  {
1693  globalPtr->FunctionExit("ViscidEnergyFlux");
1694  }
1695  }
1696  return(0);
1697  };
1698 
1699  int ViscousFlux(int iDim,int threadId)
1700  {
1701  if(globalPtr){
1702 #pragma omp barrier
1703 #pragma omp master
1704  {
1705  globalPtr->FunctionEntry("ViscousFlux");
1706  }
1707  }
1708 
1709  size_t *fluxOpInterval = NULL;
1710  if(exchangeFlux){
1711  fluxOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1712  } else {
1713  fluxOpInterval = &fortranBufferIntervals[threadId][0];
1714  }
1715  std::vector<double> &gridMetric(gridPtr->Metric());
1716 
1717  // stress tensor indexing
1718  // 2D, x: 0, 1
1719  // y: 1, 2
1720  // 3D, x: 0, 1, 2
1721  // y: 1, 3, 4
1722  // z: 2, 4, 5
1723  int fluxDim = iDim + 1;
1724  int tau1=iDim*numDim;
1725  int tau2=tau1+1;
1726  int tau3=tau2+1;
1727 
1728 
1729  // viscous fluxes
1730  FC_MODULE(viscid,strongflux1d,VISCID,STRONGFLUX1D)
1731  (&numDim,&fluxDim,&bufferSizes[0],&numPointsBuffer,fluxOpInterval,
1732  &gridType,&gridMetric[0],tauBufferPtr,heatFluxBufferPtr,
1733  viscidFluxBuffer);
1734 
1735  if(numScalar > 0){
1736  // (4) flux_i = Metric_ij * X_j (i = iDim)
1737  for(int iScalar = 0;iScalar < numScalar;iScalar++){
1738  size_t fluxOffset = numDim+2+iScalar;
1739  size_t scalarGradOffset = iScalar*numDim*numPointsBuffer;
1740  FC_MODULE(viscid,scalarflux1d,VISCID,SCALARFLUX1D)
1741  (&numDim,&fluxDim,&bufferSizes[0],&numPointsBuffer,fluxOpInterval,
1742  &gridType,&gridMetric[0],&scalarGrad[scalarGradOffset],
1743  viscidFluxBuffers[fluxOffset]);
1744  }
1745  }
1746 
1747  if(globalPtr){
1748 #pragma omp barrier
1749 #pragma omp master
1750  {
1751  globalPtr->FunctionExit("ViscousFlux");
1752  }
1753  }
1754 
1755  return(0);
1756  };
1757 
1758 
1760  void AccumulateViscousFluxes(double a,std::vector<double *> &X,std::vector<double *> &Y,
1761  int threadId,bool fullInterval = false)
1762  {
1763  if(globalPtr){
1764 #pragma omp barrier
1765 #pragma omp master
1766  {
1767  globalPtr->FunctionEntry("AccumulateVFlux");
1768  }
1769  }
1770 
1771  size_t *bufferOpInterval = NULL;
1772  if(fullInterval){
1773  bufferOpInterval = &fortranPartitionBufferIntervals[threadId][0];
1774  } else {
1775  bufferOpInterval = &fortranBufferIntervals[threadId][0];
1776  }
1777 
1778  for(int iComp = 1;iComp < numEquations;iComp++){
1780  (&numDim,&numPointsBuffer,&bufferSizes[0],bufferOpInterval,&a,
1781  X[iComp],Y[iComp]);
1782  }
1783  if(globalPtr){
1784 #pragma omp barrier
1785 #pragma omp master
1786  {
1787  globalPtr->FunctionExit("AccumulateVFlux");
1788  }
1789  }
1790 
1791  }
1792 
1793  // ============= Messaging =================
1794  void PackDVMessage(int threadId)
1795  {
1796  if(threadId == 0){
1797  for(int iDim = 0;iDim < numDV;iDim++)
1798  haloPtr->PackMessageBuffers(dvMessageId,iDim,1,dvBuffers[iDim]);
1799  }
1800  return;
1801  };
1802 
1803  void PackBufferMessage(int messageId,int numEquations,double *dataBuffer,int threadId)
1804  {
1805  if(threadId == 0){
1806  haloPtr->PackMessageBuffers(messageId,0,numEquations,dataBuffer);
1807  }
1808  };
1809  void UnpackBufferMessage(int messageId,int numEquations,double *dataBuffer,int threadId)
1810  {
1811  if(threadId == 0){
1812  haloPtr->UnPackMessageBuffers(messageId,0,numEquations,dataBuffer);
1813  }
1814  }
1815  void ExchangeBufferMessage(int messageId) // call with threadid == 0 *only* (for now)
1816  {
1817  haloPtr->SendMessage(messageId,gridNeighbors,*gridCommPtr);
1818  haloPtr->ReceiveMessage(messageId,gridNeighbors,*gridCommPtr);
1819  };
1820 
1821  void UnpackDVMessage(int threadId)
1822  {
1823  if(threadId == 0){
1824  for(int iDim = 0;iDim < numDV;iDim++)
1825  haloPtr->UnPackMessageBuffers(dvMessageId,iDim,1,dvBuffers[iDim]);
1826  }
1827  return;
1828  };
1829 
1830  void ExchangeDVMessage() // call with threadid == 0 *only* (for now)
1831  {
1832  haloPtr->SendMessage(dvMessageId,gridNeighbors,*gridCommPtr);
1833  haloPtr->ReceiveMessage(dvMessageId,gridNeighbors,*gridCommPtr);
1834  };
1835 
1836  int ExchangeDV(int threadId)
1837  {
1838  if(globalPtr){
1839 #pragma omp barrier
1840 #pragma omp master
1841  {
1842  globalPtr->FunctionEntry("ExchangeDV");
1843  }
1844  }
1845 
1846  PackDVMessage(threadId);
1847 #pragma omp barrier
1848 #pragma omp master
1849  {
1850  ExchangeDVMessage();
1851  }
1852 #pragma omp barrier
1853  UnpackDVMessage(threadId);
1854  if(globalPtr){
1855 #pragma omp barrier
1856 #pragma omp master
1857  {
1858  globalPtr->FunctionExit("ExchangeDV");
1859  }
1860  }
1861  return(0);
1862 
1863  };
1864 
1865  int ExchangeBuffer(int messageId,int numEquations,double *dataBuffer,int threadId)
1866  {
1867  if(globalPtr){
1868 #pragma omp barrier
1869 #pragma omp master
1870  {
1871  globalPtr->FunctionEntry("ExchangeBuffer");
1872  }
1873  }
1874  PackBufferMessage(messageId,numEquations,dataBuffer,threadId);
1875 #pragma omp barrier
1876 
1877 #pragma omp master
1878  {
1879  ExchangeBufferMessage(messageId);
1880  }
1881 
1882 #pragma omp barrier
1883 
1884  UnpackBufferMessage(messageId,numEquations,dataBuffer,threadId);
1885 
1886  if(globalPtr){
1887 #pragma omp barrier
1888 #pragma omp master
1889  {
1890  globalPtr->FunctionExit("ExchangeBuffer");
1891  }
1892  }
1893 
1894  return(0);
1895 
1896  };
1897 
1898 
1899  int ExchangeInviscidFlux(int threadId)
1900  {
1901  return(ExchangeBuffer(fluxMessageId,numEquations,inviscidFluxBuffer,threadId));
1902  };
1903 
1904  int ExchangeState(int threadId)
1905  {
1906  if(globalPtr){
1907  #pragma omp barrier
1908  #pragma omp master
1909  {
1910  globalPtr->FunctionEntry("ExchangeState");
1911  }
1912  }
1913 
1914 #pragma omp master
1915  {
1916  haloPtr->PackMessageBuffers(fluxMessageId,0,1,rhoPtr);
1917  haloPtr->PackMessageBuffers(fluxMessageId,1,numDim,rhoVPtr);
1918  haloPtr->PackMessageBuffers(fluxMessageId,numDim+1,1,rhoEPtr);
1919 
1920  haloPtr->SendMessage(fluxMessageId,gridNeighbors,gridPtr->Communicator());
1921  haloPtr->ReceiveMessage(fluxMessageId,gridNeighbors,gridPtr->Communicator());
1922 
1923  haloPtr->UnPackMessageBuffers(fluxMessageId,0,1,rhoPtr);
1924  haloPtr->UnPackMessageBuffers(fluxMessageId,1,numDim,rhoVPtr);
1925  haloPtr->UnPackMessageBuffers(fluxMessageId,numDim+1,1,rhoEPtr);
1926  }
1927 
1928  if(globalPtr){
1929  #pragma omp barrier
1930  #pragma omp master
1931  {
1932  globalPtr->FunctionExit("ExchangeState");
1933  }
1934  }
1935 
1936  return 0;
1937  };
1938 
1939  // ===== State-related interfaces ====
1940 
1941  // *NOT* thread safe - master only
1942  //
1943  int SetParamState(const StateType &paramState)
1944  {
1945 
1946 #pragma omp barrier
1947  if(globalPtr){
1948 #pragma omp master
1949  globalPtr->FunctionEntry("SetParamState");
1950  }
1951 
1952  //
1953  // get non-dimensional reference parameters
1954  //
1955 
1956  {
1957  int paramHandle = paramState.GetDataIndex("refRe");
1958  if(paramHandle >= 0){
1959  const pcpp::field::dataset::DataBufferType &paramData(paramState.Field(paramHandle));
1960  const double *paramPtr = paramData.Data<double>();
1961  refRe = *paramPtr;
1962  if(refRe < 0)
1963  refRe = 0;
1964  } else {
1965  refRe = 0.0;
1966  }
1967  }
1968 
1969  {
1970  int paramHandle = paramState.GetDataIndex("inputDiffusivity");
1971  if(paramHandle >= 0){
1972  const pcpp::field::dataset::DataBufferType &paramData(paramState.Field(paramHandle));
1973  inputDiffusivity = paramData.Data<double>();
1974  } else {
1975  inputDiffusivity = NULL;
1976  }
1977  }
1978 
1979  {
1980  int paramHandle = paramState.GetDataIndex("refPr");
1981  if(paramHandle >= 0){
1982  const pcpp::field::dataset::DataBufferType &paramData(paramState.Field(paramHandle));
1983  const double *paramPtr = paramData.Data<double>();
1984  refPr = *paramPtr;
1985  if(refPr < 0)
1986  refPr = 0.75;
1987  } else {
1988  refPr = 0.75;
1989  }
1990  }
1991 
1992  //
1993  // Define the reference state based on the density, pressure, and temperature
1994  // all other reference parameters derive as follows for a calorically perfect, ideal gas
1995  //
1996  // p_ref = p_inf
1997  // rho_ref = rho_inf
1998  // temperature_ref = temperature_inf
1999  //
2000  // The user has the option to run in dimensional or non-dimensional mode
2001  // dimensional mode calculates required EOS parameters (i.e. the specific gas constant
2002  // for a perfect gas) and sets the above to one
2003  //
2004  // The default behavior to run in non-dimensional mode with STP reference conditions for air
2005  //
2006  {
2007  int paramHandle = paramState.GetDataIndex("nonDimensional");
2008  std::ostringstream statusMsg;
2009  statusMsg << (paramHandle >= 0 ? "User chose" : "Defaulting to");
2010  if(paramHandle >= 0){
2011  const pcpp::field::dataset::DataBufferType &paramData(paramState.Field(paramHandle));
2012  const int *paramPtr = paramData.Data<int>();
2013  nonDimensionalMode = *paramPtr;
2014  statusMsg << (nonDimensionalMode==1 ? " non-dimensional " :
2015  nonDimensionalMode==2 ? " PlasComCM-non-dimensional " :
2016  " dimensional ");
2017  } else {
2018  nonDimensionalMode = 1;
2019  statusMsg << " non-dimensional ";
2020  }
2021  statusMsg << "mode." << std::endl;
2022  if(globalPtr){
2023  globalPtr->StdOut(statusMsg.str());
2024  } else {
2025  std::cout << statusMsg.str();
2026  }
2027  }
2028 
2029  //
2030  // get the reference state from the parameters
2031  // if it is not defined, or incomplete, we specify a default state
2032  // and warn the user
2033  //
2034  bool haveRefRho = false;
2035  bool haveRefPressure = false;
2036  bool haveRefTemperature = false;
2037  {
2038  int paramHandle = paramState.GetDataIndex("refRho");
2039  if(paramHandle >= 0){
2041  &paramData(paramState.Field(paramHandle));
2042  const double *paramPtr = paramData.Data<double>();
2043  refRho = *paramPtr;
2044  haveRefRho = true;
2045  }
2046  }
2047 
2048  {
2049  int paramHandle = paramState.GetDataIndex("refPressure");
2050  if(paramHandle >= 0){
2052  &paramData(paramState.Field(paramHandle));
2053  const double *paramPtr = paramData.Data<double>();
2054  refPressure = *paramPtr;
2055  haveRefPressure = true;
2056  }
2057  }
2058 
2059  {
2060  int paramHandle = paramState.GetDataIndex("refTemperature");
2061  if(paramHandle >= 0){
2063  &paramData(paramState.Field(paramHandle));
2064  const double *paramPtr = paramData.Data<double>();
2065  refTemperature = *paramPtr;
2066  haveRefTemperature = true;
2067  }
2068  }
2069 
2070  if(!(haveRefRho && haveRefPressure && haveRefTemperature)){
2071  refRho = 1.225;
2072  refPressure = 101325;
2073  refTemperature = 288.15;
2074  std::ostringstream statusMessage;
2075  statusMessage << "Warning: EOS reference state missing or incomplete in input. " << std::endl
2076  << "User must specify refRho, refPressure, and refTemperature. " << std::endl
2077  << "Setting to default values: " << std::endl
2078  << "\t refRho=" << refRho << std::endl
2079  << "\t refPressure=" << refPressure << std::endl
2080  << "\t refTemperature=" << refTemperature << std::endl
2081  << std::endl;
2082  if(globalPtr){
2083  globalPtr->StdOut(statusMessage.str());
2084  } else {
2085  std::cout << statusMessage.str();
2086  }
2087  }
2088 
2089  {
2090  int paramHandle = paramState.GetDataIndex("refLength");
2091  if(paramHandle >= 0){
2093  &paramData(paramState.Field(paramHandle));
2094  const double *paramPtr = paramData.Data<double>();
2095  refLength = *paramPtr;
2096  } else {
2097  refLength = 1.0;
2098  std::ostringstream statusMessage;
2099  statusMessage << "Warning: Could not find refLength in input" << std::endl
2100  << "Setting to default value " << refLength << std::endl;
2101  if(globalPtr){
2102  globalPtr->StdOut(statusMessage.str());
2103  } else {
2104  std::cout << statusMessage.str();
2105  }
2106  }
2107 
2108 
2109  }
2110 
2111  //
2112  // initialize equation of state object
2113  // get data associated with the chosen equation of state (i.e. gamma)
2114  // and transport laws that may be needed to fully define the reference state
2115  //
2116  if(gasModel == IDEAL) {
2117  eosPtr = new eos::perfect_gas();
2118 
2119  gammaHandle = paramState.GetDataIndex("gamma");
2120  if(gammaHandle < 0) {
2121  std::ostringstream statusMessage;
2122  statusMessage << "Gamma does not exist in input parameter state."
2123  << " Exiting." << std::endl;
2124  if(globalPtr){
2125  globalPtr->StdOut(statusMessage.str());
2126  globalPtr->FunctionExit("SetParamState");
2127  } else {
2128  std::cout << statusMessage.str();
2129  }
2130  return(1);
2131  }
2132 
2133  const pcpp::field::dataset::DataBufferType &gammaData(paramState.Field(gammaHandle));
2134  const double *gammaPtr = gammaData.Data<double>();
2135  if(!gammaPtr) {
2136  std::ostringstream statusMessage;
2137  statusMessage << "Gamma not defined in input parameter state."
2138  << " Exiting." << std::endl;
2139  if(globalPtr){
2140  globalPtr->StdOut(statusMessage.str());
2141  globalPtr->FunctionExit("SetParamState");
2142  } else {
2143  std::cout << statusMessage.str();
2144  }
2145  return(1);
2146  }
2147 
2148  eosPtr->SetGamma(*gammaPtr);
2149  } else {
2150  std::ostringstream statusMessage;
2151  statusMessage << "Error: Unknown gas model selected." << gasModel
2152  << " Exiting." << std::endl;
2153  if(globalPtr){
2154  globalPtr->StdOut(statusMessage.str());
2155  globalPtr->FunctionExit("SetParamState");
2156  } else {
2157  std::cout << statusMessage.str();
2158  }
2159  return(1);
2160  }
2161 
2162  if(refRe > 0) {
2163  if(transportModel == POWER) {
2164 
2165  // power
2166  powerHandle = paramState.GetDataIndex("power");
2167  if(powerHandle < 0) {
2168  std::ostringstream statusMessage;
2169  statusMessage << "Power does not exist in input parameter state." << std::endl
2170  << " Required for the Power Law transport model." << std::endl
2171  << " Exiting." << std::endl;
2172  if(globalPtr){
2173  globalPtr->StdOut(statusMessage.str());
2174  globalPtr->FunctionExit("SetParamState");
2175  } else {
2176  std::cout << statusMessage.str();
2177  }
2178  return(1);
2179  }
2180 
2182  &powerData(paramState.Field(powerHandle));
2183  powerPtr = powerData.Data<double>();
2184  if(!powerPtr) {
2185  std::ostringstream statusMessage;
2186  statusMessage << "Power not defined in input parameter state." << std::endl
2187  << "Required for the Power Law transport model." << std::endl
2188  << "Example: power=2/3 for air." << std::endl
2189  << "Exiting." << std::endl;
2190  if(globalPtr){
2191  globalPtr->StdOut(statusMessage.str());
2192  globalPtr->FunctionExit("SetParamState");
2193  } else {
2194  std::cout << statusMessage.str();
2195  }
2196  return(1);
2197  }
2198  power = *powerPtr;
2199 
2200  // beta
2201  betaHandle = paramState.GetDataIndex("beta");
2202  if(betaHandle < 0) {
2203  std::ostringstream statusMessage;
2204  statusMessage << "beta does not exist in input parameter state." << std::endl
2205  << "Required for the beta Law transport model." << std::endl
2206  << "Exiting." << std::endl;
2207  if(globalPtr){
2208  globalPtr->StdOut(statusMessage.str());
2209  globalPtr->FunctionExit("SetParamState");
2210  } else {
2211  std::cout << statusMessage.str();
2212  }
2213  return(1);
2214  }
2215 
2217  &betaData(paramState.Field(betaHandle));
2218  betaPtr = betaData.Data<double>();
2219  if(!betaPtr) {
2220  std::ostringstream statusMessage;
2221  statusMessage << "beta not defined in input parameter state." << std::endl
2222  << "Required for the beta Law transport model." << std::endl
2223  << "Example: beta=4.093*10^-7 for air." << std::endl
2224  << "Exiting." << std::endl;
2225  if(globalPtr){
2226  globalPtr->StdOut(statusMessage.str());
2227  globalPtr->FunctionExit("SetParamState");
2228  } else {
2229  std::cout << statusMessage.str();
2230  }
2231  return(1);
2232  }
2233  beta = *betaPtr;
2234 
2235  //bulkViscosity Factor
2236  bulkViscFacHandle = paramState.GetDataIndex("bulkViscFac");
2237  if(bulkViscFacHandle < 0) {
2238  std::ostringstream statusMessage;
2239  statusMessage << "bulkViscFac does not exist in input parameter state." << std::endl
2240  << "Required for the bulkViscFac Law transport model."<< std::endl
2241  << "Exiting." << std::endl;
2242  if(globalPtr){
2243  globalPtr->StdOut(statusMessage.str());
2244  globalPtr->FunctionExit("SetParamState");
2245  } else {
2246  std::cout << statusMessage.str();
2247  }
2248  return(1);
2249  }
2250 
2252  &bulkViscFacData(paramState.Field(bulkViscFacHandle));
2253  bulkViscFacPtr = bulkViscFacData.Data<double>();
2254  if(!bulkViscFacPtr) {
2255  std::ostringstream statusMessage;
2256  statusMessage << "bulkViscFac not defined in input parameter state." << std::endl
2257  << "Required for the bulkViscFac Law transport model."<< std::endl
2258  << "Example: bulkViscFac=0.6 for air." << std::endl
2259  << "Exiting." << std::endl;
2260  if(globalPtr){
2261  globalPtr->StdOut(statusMessage.str());
2262  globalPtr->FunctionExit("SetParamState");
2263  } else {
2264  std::cout << statusMessage.str();
2265  }
2266  return(1);
2267  }
2268  bulkViscFac = *bulkViscFacPtr;
2269 
2270  } else {
2271  std::ostringstream statusMessage;
2272  statusMessage << "Error: Unknown transport model selected."
2273  << transportModel << " Exiting." << std::endl;
2274  if(globalPtr){
2275  globalPtr->StdOut(statusMessage.str());
2276  globalPtr->FunctionExit("SetParamState");
2277  } else {
2278  std::cout << statusMessage.str();
2279  }
2280  return(1);
2281  }
2282  }
2283 
2284  //
2285  // derive the remaining reference state variables
2286  //
2287  if(gasModel == IDEAL) {
2288  double gamma = eosPtr->GetGamma();
2289  if(nonDimensionalMode == 1){
2290  specGasConst = 1.0;
2291  refSpecGasConst = refPressure/refRho/refTemperature;
2292  refVelocity = sqrt(refPressure/refRho);
2293  refSndSpd = refVelocity*sqrt(gamma);
2294  refEnergy = refPressure/(gamma-1.0)/refRho;
2295  refCp = refSpecGasConst*gamma/(gamma-1.0);
2296  refCv = refCp-refSpecGasConst;
2297 
2298 
2299  pressureScale = refPressure;
2300  temperatureScale = refTemperature;
2301  velocityScale = refVelocity;
2302 
2303  } else if(nonDimensionalMode == 2){
2304 
2305  specGasConst = (gamma-1)/gamma;
2306  refSpecGasConst = refPressure/refRho/refTemperature;
2307  refVelocity = sqrt(gamma*refPressure/refRho);
2308  refSndSpd = refVelocity;
2309  refEnergy = refPressure/(gamma-1.0)/refRho;
2310  refCp = refSpecGasConst*gamma/(gamma-1.0);
2311  refCv = refCp-refSpecGasConst;
2312 
2313  pressureScale = refRho*refSndSpd*refSndSpd;
2314  temperatureScale = (gamma-1)*refTemperature;
2315  velocityScale = refSndSpd;
2316 
2317  std::ostringstream statusMessage;
2318  statusMessage << "Enabling legacy PlasComCM nonDimensionalization mode." << std::endl;
2319  if(globalPtr){
2320  globalPtr->StdOut(statusMessage.str());
2321  } else {
2322  std::cout << statusMessage.str();
2323  }
2324 
2325  } else {
2326 
2327  refVelocity = sqrt(refPressure/refRho);
2328  specGasConst = refPressure/refRho/refTemperature;
2329  refSndSpd = refVelocity*sqrt(gamma);
2330  refCp = specGasConst*gamma/(gamma-1.0);
2331  refCv = refCp-specGasConst;
2332  refEnergy = refPressure/(gamma-1.0)/refRho;
2333 
2334  refRho = 1.0;
2335  refPressure = 1.0;
2336  refTemperature = 1.0;
2337  refVelocity = 1.0;
2338  refSpecGasConst = 1.0;
2339 
2340  pressureScale = 1.0;
2341  temperatureScale = 1.0;
2342  velocityScale = 1.0;
2343  }
2344 
2345  eosPtr->SetSpecificGasConstant(specGasConst);
2346  eosPtr->InitializeMaterialProperties();
2347  }
2348 
2349 
2350  //
2351  // in dimensional mode all the non-dimensional numbers become unity
2352  //
2353  if(refRe>0){
2354  if(nonDimensionalMode != 0){
2355  refMu = refRho*refVelocity*refLength/refRe;
2356  refKappa = refCp*refMu/refPr;
2357  } else {
2358  refRe = 1.0;
2359  refMu = 1.0;
2360  }
2361  }
2362 
2363  //
2364  // Scale the input parameters for non-dimensional runs
2365  //
2366  if(refRe>0){
2367  if(nonDimensionalMode == 1){
2368  if(transportModel == POWER){
2369  beta = 1.0;
2370  }
2371  } else if(nonDimensionalMode == 2){
2372  double gamma = eosPtr->GetGamma();
2373  if(transportModel == POWER){
2374  //beta = beta*pow(refTemperature,power)/refMu;
2375  beta = pow(gamma-1,power);
2376  }
2377  }
2378  }
2379 
2380 
2381  //
2382  // Report the current reference state to user
2383  std::ostringstream refStateMsg;
2384  refStateMsg << "EulerRHS Reference State: " << std::endl
2385  << "Reynolds Number: \t" << refRe << std::endl
2386  << "Prandtl Number: \t" << refPr << std::endl
2387 
2388  << "Length Reference: \t" << refLength << std::endl
2389  << "Density Reference: \t" << refRho << std::endl
2390  << "Pressure Reference: \t" << refPressure << std::endl
2391  << "Temperature Reference: \t" << refTemperature << std::endl
2392 
2393  << "Specific Gas Constant Reference: \t" << refSpecGasConst << std::endl
2394  << "Energy Reference: \t" << refEnergy << std::endl
2395  << "Velocity Reference: \t" << refVelocity << std::endl
2396  << "Speed of Sound Reference: \t" << refSndSpd << std::endl
2397  << "Cp Reference: \t" << refCp << std::endl
2398  << "Cv Reference: \t" << refCv << std::endl;
2399 
2400  if(nonDimensionalMode == 0) {
2401  refStateMsg << "EulerRHS set to run in dimensional mode." << std::endl
2402  << "Specific Gas Constant: \t" << specGasConst << std::endl
2403  << "Speed of sound: \t" << refSndSpd << std::endl
2404  << "Cp: \t" << eosPtr->GetHeatCapacityCp() << std::endl
2405  << "Cv: \t" << eosPtr->GetHeatCapacityCv() << std::endl;
2406  }
2407 
2408  if(globalPtr){
2409  globalPtr->StdOut(refStateMsg.str());
2410  } else {
2411  std::cout << refStateMsg.str();
2412  }
2413 
2414  std::ostringstream paramStatusMsg;
2415 
2416  //
2417  // initialization of other simulation parameters
2418  //
2419  inputCFL = 1.0;
2420  int inputCFLHandle = paramState.GetDataIndex("inputCFL");
2421  if(inputCFLHandle >= 0){
2422  const pcpp::field::dataset::DataBufferType &cflData(paramState.Field(inputCFLHandle));
2423  const double *inCFLPtr = cflData.Data<double>();
2424  inputCFL = *inCFLPtr;
2425  paramStatusMsg << "Input CFL = " << inputCFL << std::endl;
2426  }
2427  if(inputCFL <= 0){
2428  inputCFL = 1.0;
2429  paramStatusMsg << "Defaulting CFL = " << inputCFL << std::endl;
2430  }
2431 
2432 
2433  inputDT = -1.0;
2434  int inputDTHandle = paramState.GetDataIndex("inputDT");
2435  if(inputDTHandle >= 0){
2436  const pcpp::field::dataset::DataBufferType &inputDTData(paramState.Field(inputDTHandle));
2437  const double *inputDTPtr = inputDTData.Data<double>();
2438  inputDT = *inputDTPtr;
2439  paramStatusMsg << "Input DT = " << inputDT << std::endl;
2440  }
2441  if(inputDT < 0){ // inputDT = 0, rhs and advancer still operate, but state doesn't change (useful for testing)
2442  timeSteppingMode = CONSTANT_CFL;
2443  paramStatusMsg << "User-specified DT is invalid, defaulting to CONSTANT_CFL mode."
2444  << std::endl;
2445  }
2446 
2447  sigmaHandle = paramState.GetDataIndex("sigmaDissipation");
2448  if(sigmaHandle >= 0){
2449  const pcpp::field::dataset::DataBufferType &sigmaData(paramState.Field(sigmaHandle));
2450  sigmaPtr = sigmaData.Data<double>();
2451  inputSigma = *sigmaPtr;
2452  } else {
2453  sigmaPtr = NULL;
2454  inputSigma = 0.0;
2455  }
2456 
2457  int sigmaDilHandle = paramState.GetDataIndex("sigmaDilatation");
2458  if(sigmaDilHandle >= 0){
2459  const pcpp::field::dataset::DataBufferType &sigmaData(paramState.Field(sigmaDilHandle));
2460  sigmaDilPtr = sigmaData.Data<double>();
2461  inputSigmaDil = *sigmaDilPtr;
2462  } else {
2463  sigmaDilPtr = NULL;
2464  inputSigmaDil = 0.0;
2465  }
2466 
2467 
2468  if(inputSigma > 0.0 || inputSigmaDil > 0.0){
2469  artificialDissipation = true;
2470  }
2471  if(artificialDissipation){
2472  if(inputSigma < 0 || inputSigmaDil < 0){
2473  return(1);
2474  }
2475  }
2476 
2477 
2478 
2479  {
2480  int paramHandle = paramState.GetDataIndex("Flags");
2481  if(paramHandle >= 0){
2482  const pcpp::field::dataset::DataBufferType &paramData(paramState.Field(paramHandle));
2483  const int *paramPtr = paramData.Data<int>();
2484  int optionFlags = *paramPtr;
2485  if(*paramPtr > 0){
2486  // useAlternateRHS = optionFlags&ALTERNATERHS;
2487  // exchangeFlux = optionFlags&EXCHANGEFLUX;
2488  exchangeDV = optionFlags&EXCHANGEDV;
2489  useWENO = optionFlags&USEWENO;
2490  }
2491  }
2492  if(refRe > 0){
2493  paramStatusMsg << "EulerRHS: Viscous flow, enabling DV exchange." << std::endl;
2494  exchangeDV = true;
2495  }
2496  if(artificialDissipation){
2497  paramStatusMsg << "EulerRHS: Artificial dissipation ON.";
2498  if(refRe == 0)
2499  paramStatusMsg << " Enabling DV exchange.";
2500  paramStatusMsg << std::endl;
2501  exchangeDV = true;
2502  }
2503  if(exchangeFlux){
2504  paramStatusMsg << "EulerRHS: Enabling flux exchange." << std::endl;
2505  }
2506  }
2507 
2508 #pragma omp barrier
2509  if(globalPtr){
2510 #pragma omp master
2511  {
2512  globalPtr->StdOut(paramStatusMsg.str());
2513  globalPtr->FunctionExit("SetParamState");
2514  }
2515  } else {
2516  std::cout << paramStatusMsg.str();
2517  }
2518 
2519  return(0);
2520  };
2521 
2522  // *NOT* thread-safe, call on master only
2523  int InitializeState(StateType &inState)
2524  {
2525 
2526  if(!gridInitialized)
2527  return(1);
2528 
2529  baseStatePtr = &inState;
2530 
2531  timeHandle = inState.GetDataIndex("simTime");
2532  if(timeHandle < 0)
2533  return(1);
2534  pcpp::field::dataset::DataBufferType &timeData(inState.Field(timeHandle));
2535  timePtr = timeData.Data<double>();
2536  if(!timePtr)
2537  return(1);
2538  time = *timePtr;
2539 
2540  cflHandle = inState.GetDataIndex("simCFL");
2541  if(cflHandle >= 0){
2542  pcpp::field::dataset::DataBufferType &cflData(inState.Field(cflHandle));
2543  cflPtr = cflData.Data<double>();
2544  }
2545 
2546  dtHandle = inState.GetDataIndex("simDT");
2547  if(dtHandle >= 0){
2548  pcpp::field::dataset::DataBufferType &dtData(inState.Field(dtHandle));
2549  dtPtr = dtData.Data<double>();
2550  }
2551 
2552  // rhoHandle = inState.GetDataIndex("rho");
2553  rhoHandle = inState.GetFieldHandle("rho");
2554  if(rhoHandle < 0)
2555  return(1);
2556  pcpp::field::dataset::DataBufferType &rhoData(inState.GetFieldDataByHandle(rhoHandle));
2557  rhoPtr = rhoData.Data<double>();
2558  if(!rhoPtr)
2559  return(1);
2560 
2561  // rhoVHandle = inState.GetDataIndex("rhoV");
2562  rhoVHandle = inState.GetFieldHandle("rhoV");
2563  if(rhoVHandle < 0)
2564  return(1);
2565  pcpp::field::dataset::DataBufferType &rhoVData(inState.GetFieldDataByHandle(rhoVHandle));
2566  rhoVPtr = rhoVData.Data<double>();
2567  if(!rhoVPtr)
2568  return(1);
2569 
2570  // rhoEHandle = inState.GetDataIndex("rhoE");
2571  rhoEHandle = inState.GetFieldHandle("rhoE");
2572  if(rhoEHandle < 0)
2573  return(1);
2574  pcpp::field::dataset::DataBufferType &rhoEData(inState.GetFieldDataByHandle(rhoEHandle));
2575  rhoEPtr = rhoEData.Data<double>();
2576  if(!rhoEPtr)
2577  return(1);
2578 
2579  pressureHandle = inState.GetDataIndex("pressure");
2580  if(pressureHandle >= 0){
2581  pcpp::field::dataset::DataBufferType &pressureData(inState.Field(pressureHandle));
2582  pressurePtr = pressureData.Data<double>();
2583  }
2584 
2585  temperatureHandle = inState.GetDataIndex("temperature");
2586  if(temperatureHandle >= 0){
2587  pcpp::field::dataset::DataBufferType &temperatureData(inState.Field(temperatureHandle));
2588  temperaturePtr = temperatureData.Data<double>();
2589  }
2590 
2591  // Optional data
2592  rhom1Handle = inState.GetDataIndex("rhom1");
2593  if(rhom1Handle >= 0){
2594  pcpp::field::dataset::DataBufferType &rhom1Data(inState.Field(rhom1Handle));
2595  rhom1Ptr = rhom1Data.Data<double>();
2596  }
2597 
2598  velocityHandle = inState.GetDataIndex("velocity");
2599  if(velocityHandle >= 0){
2600  pcpp::field::dataset::DataBufferType &velocityData(inState.Field(velocityHandle));
2601  velocityPtr = velocityData.Data<double>();
2602  }
2603 
2604  internalEnergyHandle = inState.GetDataIndex("internalEnergy");
2605  if(internalEnergyHandle >= 0){
2606  pcpp::field::dataset::DataBufferType &internalEnergyData(inState.Field(internalEnergyHandle));
2607  internalEnergyPtr = internalEnergyData.Data<double>();
2608  }
2609 
2610  // scalarHandle = inState.GetDataIndex("scalarVars");
2611  scalarHandle = inState.GetFieldHandle("scalarVars");
2612  if(scalarHandle >= 0){
2613  int scalarDataIndex = inState.GetFieldIndexByHandle(scalarHandle);
2614  pcpp::field::dataset::DataBufferType &scalarData(inState.GetFieldDataByHandle(scalarHandle));
2615  numScalar = inState.Meta()[scalarDataIndex].ncomp;
2616  scalarPtr = scalarData.Data<double>();
2617  if(!scalarPtr)
2618  return(1);
2619  } else {
2620  scalarPtr = NULL;
2621  numScalar = 0;
2622  }
2623 
2624 
2625  int scalarGradHandle = inState.GetDataIndex("scalarGrad");
2626  if(scalarGradHandle >= 0){
2627  pcpp::field::dataset::DataBufferType &gradData(inState.GetFieldDataByHandle(scalarGradHandle));
2628  scalarGrad = gradData.Data<double>();
2629  if(!scalarGrad)
2630  return(1);
2631  } else {
2632  scalarGrad = NULL;
2633  }
2634 
2635  int stencilConnHandle = inState.GetDataIndex("sconn");
2636  if(stencilConnHandle >= 0){
2637  // if(!stencilConn)
2638  // return(1);
2639  // inState.SetFieldBuffer("sconn",stencilConn);
2640  pcpp::field::dataset::DataBufferType &scData(inState.Field(stencilConnHandle));
2641  stencilConn = scData.Data<int>();
2642  if(!stencilConn)
2643  return(1);
2644  } else {
2645  stencilConn = NULL;
2646  }
2647 
2648  int iMaskHandle = inState.GetDataIndex("imask");
2649  if(iMaskHandle >= 0){
2650  pcpp::field::dataset::DataBufferType &imData(inState.Field(iMaskHandle));
2651  iMask = imData.Data<int>();
2652  if(!iMask)
2653  return(1);
2654  } else {
2655  iMask = NULL;
2656  }
2657 
2658  int dilatationHandle = inState.GetDataIndex("divV");
2659  if(dilatationHandle >= 0){
2660  pcpp::field::dataset::DataBufferType &dilData(inState.Field(dilatationHandle));
2661  velDiv = dilData.Data<double>();
2662  if(!velDiv)
2663  return(1);
2664  } else {
2665  velDiv = NULL;
2666  }
2667 
2668  // dynamic viscosity, mu
2669  muHandle = inState.GetDataIndex("mu");
2670  if(muHandle >= 0){
2671  pcpp::field::dataset::DataBufferType &muData(inState.Field(muHandle));
2672  muPtr = muData.Data<double>();
2673  } else {
2674  muPtr = NULL;
2675  }
2676 
2677  // bulk viscosity, lambda
2678  lambdaHandle = inState.GetDataIndex("lambda");
2679  if(lambdaHandle >= 0 ){
2680  pcpp::field::dataset::DataBufferType &lambdaData(inState.Field(lambdaHandle));
2681  lambdaPtr = lambdaData.Data<double>();
2682  } else {
2683  lambdaPtr = NULL;
2684  }
2685 
2686  // heat transfer coefficient, kappa
2687  kappaHandle = inState.GetDataIndex("kappa");
2688  if(kappaHandle >= 0){
2689  pcpp::field::dataset::DataBufferType &kappaData(inState.Field(kappaHandle));
2690  kappaPtr = kappaData.Data<double>();
2691  } else {
2692  kappaPtr = NULL;
2693  }
2694 
2695  int diffusivityHandle = inState.GetDataIndex("scalarDiffusivity");
2696  if(diffusivityHandle >= 0){
2697  pcpp::field::dataset::DataBufferType &diffusivityData(inState.Field(diffusivityHandle));
2698  int numDiff = inState.Meta()[diffusivityHandle].ncomp;
2699  if(numDiff != numScalar){
2700  std::cerr << "Scalar Diffusivities of improper size ( "
2701  << numDiff << " != number of scalars ("
2702  << numScalar << ")." << std::endl;
2703  return(1);
2704  }
2705  scalarDiffusivity = diffusivityData.Data<double>();
2706  } else {
2707  scalarDiffusivity = NULL;
2708  }
2709 
2710  // Number of equations we actually solve
2711  numEquations = numDim+2+numScalar;
2712  myStateBuffers.resize(numEquations+1,NULL); // extra one for scalar transport to keep API happy
2713 
2714  // myStateBuffers.resize(4,NULL);
2715  int iEquation = 0;
2716  myStateBuffers[iEquation++] = rhoPtr;
2717  for(int iDim = 0;iDim < numDim;iDim++)
2718  myStateBuffers[iEquation++] = &rhoVPtr[iDim*numPointsBuffer];
2719  myStateBuffers[iEquation++] = rhoEPtr;
2720  for(int iScalar = 0;iScalar < numScalar;iScalar++)
2721  myStateBuffers[iEquation++] = &scalarPtr[iScalar*numPointsBuffer];
2722  myRHSBuffers.resize(numEquations+1,NULL);
2723 
2724  if(dvBuffers.empty()){
2725 
2726  //
2727  numDV = numDim+4; // p T 1/rho V e
2728 
2729  // New shiny
2730  // dvBuffer = new double [numPointsBuffer * numDV];
2731  // fluxComponentPtr = new double [numFluxComponents * numPointsBuffer];
2732 
2733  // Old busted
2734  dvBuffers.resize(numDV); // = new double [6*numPoints];
2735 
2737  // scaledPressure = new double [numPointsBuffer];
2738 
2739  if(pressurePtr){
2740  dvBuffers[0] = pressurePtr;
2741  } else {
2742  dvBuffers[0] = new double [numPointsBuffer];
2743  pressurePtr = dvBuffers[0];
2744  }
2745  if(temperaturePtr){
2746  dvBuffers[1] = temperaturePtr;
2747  } else {
2748  dvBuffers[1] = new double [numPointsBuffer];
2749  temperaturePtr = dvBuffers[1];
2750  }
2751  if(rhom1Ptr){
2752  dvBuffers[2] = rhom1Ptr;
2753  } else {
2754  dvBuffers[2] = new double [numPointsBuffer];
2755  rhom1Ptr = dvBuffers[2];
2756  }
2757  if(!velocityPtr)
2758  velocityPtr = new double [numDim*numPointsBuffer];
2759  for(int iDim = 0;iDim < numDim;iDim++)
2760  dvBuffers[iDim+3] = &velocityPtr[iDim*numPointsBuffer];
2761  if(internalEnergyPtr){
2762  dvBuffers[3+numDim] = internalEnergyPtr;
2763  } else {
2764  dvBuffers[3+numDim] = new double [numPointsBuffer];
2765  internalEnergyPtr = dvBuffers[3+numDim];
2766  }
2767  }
2768 
2769  if(tvBuffers.empty()){
2770 
2771  numTV = 3+2*numScalar; // mu lambda kappa [scalar diffusivities]
2772  tvBuffers.resize(numTV,NULL);
2773  scaledTau = new double [numPointsBuffer];
2774 
2775  if(muPtr){
2776  tvBuffers[0] = muPtr;
2777  } else {
2778  tvBuffers[0] = new double [numPointsBuffer];
2779  muPtr = tvBuffers[0];
2780  }
2781  if(lambdaPtr){
2782  tvBuffers[1] = lambdaPtr;
2783  } else {
2784  tvBuffers[1] = new double [numPointsBuffer];
2785  lambdaPtr = tvBuffers[1];
2786  }
2787  if(kappaPtr){
2788  tvBuffers[2] = kappaPtr;
2789  } else {
2790  tvBuffers[2] = new double [numPointsBuffer];
2791  kappaPtr = tvBuffers[2];
2792  }
2793  if(numScalar > 0){
2794  if(!scalarDiffusivity){
2795  scalarDiffusivity = new double [numScalar*numPointsBuffer];
2796  }
2797  for(int iScalar = 0;iScalar < numScalar;iScalar++){
2798  size_t scalarOffset = iScalar*numPointsBuffer;
2799  tvBuffers[3+iScalar] = &scalarDiffusivity[scalarOffset];
2800  double defaultDiffusivity = 1.0;
2801  if(inputDiffusivity){
2802  defaultDiffusivity = inputDiffusivity[iScalar];
2803  }
2804  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++)
2805  scalarDiffusivity[scalarOffset+iPoint] = defaultDiffusivity;
2806  }
2807 
2809  // tvBuffers[3+numScalar+iScalar] if needed, allocate in the above loop
2810 
2811  }
2812  }
2813 
2814  // initialize the RHS state object
2815  rhsState.AddField("vHat",'n',1,8,""); // only one component of vhat
2816  rhsState.AddField("viscidEnergy",'n',3,8,"");
2817  rhsState.AddField("inviscidFlux",'n',numEquations,8,"");
2818  rhsState.AddField("viscidFlux",'n',numEquations,8,"");
2819  rhsState.AddField("dFlux",'n',numEquations,8,"");
2820  if(refRe > 0 || artificialDissipation){
2821  rhsState.AddField("velGrad",'n',numDim*numDim,8,"");
2822  if(artificialDissipation){
2823  rhsState.AddField("velDiv",'n',1,8,"");
2824  rhsState.AddField("sigmaDiss",'n',1,8,"");
2825  rhsState.AddField("alphaDiss",'n',1,8,"");
2826  }
2827  }
2828  if(refRe > 0){
2829  rhsState.AddField("tau",'n',(numDim*(numDim+1))/2,8,"");
2830  rhsState.AddField("temperatureGrad",'n',numDim,8,"");
2831  rhsState.AddField("heatFlux",'n',numDim,8,"");
2832  rhsState.AddField("scalarGrad",'n',numDim*numScalar,8,"");
2833  tempVector = new double [numPointsBuffer*numDim];
2834  tempScalar = new double [numPointsBuffer];
2835  }
2836  rhsState.Create(numPointsBuffer,0);
2837  velHat = rhsState.template GetFieldBuffer<double>("vHat");
2838  viscidEnergy = rhsState.template GetFieldBuffer<double>("viscidEnergy");
2839  if(artificialDissipation){
2840  if(velDiv){
2841  rhsState.SetFieldBuffer("velDiv",velDiv);
2842  } else {
2843  velDiv = rhsState.template GetFieldBuffer<double>("velDiv");
2844  }
2845  sigmaDissipation = rhsState.template GetFieldBuffer<double>("sigmaDiss");
2846  alphaDissipation = rhsState.template GetFieldBuffer<double>("alphaDiss");
2847  } else {
2848  sigmaDissipation = NULL;
2849  alphaDissipation = NULL;
2850  }
2851 
2852  velocityHandle = inState.GetDataIndex("velocity");
2853  if(velocityHandle >= 0){
2854  pcpp::field::dataset::DataBufferType &velocityData(inState.Field(velocityHandle));
2855  velocityPtr = velocityData.Data<double>();
2856  }
2857 
2858  // inviscid flux buffers
2859  if(inviscidFluxBuffers.empty()){
2860  inviscidFluxBuffers.resize(numEquations);
2861  }
2862  int inviscidFluxHandle = rhsState.GetDataIndex("inviscidFlux");
2863  inviscidFluxBuffer = rhsState.GetRealFieldBuffer(inviscidFluxHandle);
2864  for(int i=0;i<numEquations;i++){
2865  inviscidFluxBuffers[i] = &inviscidFluxBuffer[i*numPointsBuffer];
2866  }
2867 
2868  // viscid flux buffers
2869  if(viscidFluxBuffers.empty()){
2870  viscidFluxBuffers.resize(numEquations);
2871  }
2872  int viscidFluxHandle = rhsState.GetDataIndex("viscidFlux");
2873  viscidFluxBuffer = rhsState.GetRealFieldBuffer(viscidFluxHandle);
2874  for(int i=0;i<numEquations;i++){
2875  viscidFluxBuffers[i] = &viscidFluxBuffer[i*numPointsBuffer];
2876  }
2877 
2878  // flux deriviatives
2879  if(dFluxBuffers.empty()){
2880  dFluxBuffers.resize(numEquations);
2881  }
2882  int dFluxHandle = rhsState.GetDataIndex("dFlux");
2883  dFluxBuffer = rhsState.GetRealFieldBuffer(dFluxHandle);
2884  for(int i=0;i<numEquations;i++){
2885  dFluxBuffers[i] = &dFluxBuffer[i*numPointsBuffer];
2886  }
2887 
2888  if(refRe > 0){
2889  if(velGradBuffers.empty()){
2890  velGradBuffers.resize(numDim);
2891  }
2892  int velGradHandle = rhsState.GetDataIndex("velGrad");
2893  velGradBufferPtr = rhsState.GetRealFieldBuffer(velGradHandle);
2894  for(int i=0;i<numDim;i++){
2895  velGradBuffers[i] = &velGradBufferPtr[i*numDim*numPointsBuffer];
2896  }
2897  if(numScalar > 0){
2898  if(scalarGrad == NULL)
2899  scalarGrad = rhsState.GetRealFieldBuffer(rhsState.GetDataIndex("scalarGrad"));
2900  else
2901  rhsState.SetFieldBuffer("scalarGrad",scalarGrad);
2902  }
2903  if(tauBuffers.empty()){
2904  tauBuffers.resize(numDim*numDim);
2905  }
2906  int tauHandle = rhsState.GetDataIndex("tau");
2907  tauBufferPtr = rhsState.GetRealFieldBuffer(tauHandle);
2908 
2909  // tau is a symmetric 2-tensor, only store the upper half
2910  // and set the pointers of the lower half to the memory
2911  // for the upper half
2912  size_t bufferIndex = 0;
2913  for(int i=0;i<numDim;i++){
2914  for(int j=0;j<numDim;j++){
2915  int index = i*numDim + j;
2916  if (i <= j){
2917  tauBuffers[index] = &tauBufferPtr[bufferIndex];
2918  bufferIndex += numPointsBuffer;
2919  } else {
2920  tauBuffers[index] = tauBuffers[j*numDim+i];
2921  }
2922  }
2923  }
2924 
2925  // thermal conduction storage
2926  if(temperatureGradBuffers.empty()){
2927  temperatureGradBuffers.resize(numDim);
2928  }
2929  int temperatureGradHandle = rhsState.GetDataIndex("temperatureGrad");
2930  temperatureGradBufferPtr = rhsState.GetRealFieldBuffer(temperatureGradHandle);
2931  for(int i=0;i<numDim;i++){
2932  temperatureGradBuffers[i] = &temperatureGradBufferPtr[i*numPointsBuffer];
2933  }
2934 
2935  if(heatFluxBuffers.empty()){
2936  heatFluxBuffers.resize(numDim);
2937  }
2938  int heatFluxHandle = rhsState.GetDataIndex("heatFlux");
2939  heatFluxBufferPtr = rhsState.GetRealFieldBuffer(heatFluxHandle);
2940 
2941  for(int i=0;i<numDim;i++){
2942  heatFluxBuffers[i] = &heatFluxBufferPtr[i*numPointsBuffer];
2943  }
2944 
2945  }
2946 
2947  //
2948  // register needed buffers with the eos object
2949  //
2950  eosPtr->SetupPressureBuffer(pressurePtr);
2951  eosPtr->SetupTemperatureBuffer(temperaturePtr);
2952  eosPtr->SetupSpecificVolumeBuffer(rhom1Ptr);
2953  eosPtr->SetupInternalEnergyBuffer(internalEnergyPtr);
2954 
2955  dScalarHandle = scalarHandle;
2956 
2957  stateInitialized = true;
2958 
2959  return(0);
2960  };
2961 
2962  // *NOT* thread-safe, call on master only
2963  int SetTargetState(StateType &inState)
2964  {
2965  if(!stateInitialized)
2966  return(1);
2967 
2968  targetState.CopyStateData(inState);
2969 
2970  int rhoTargetHandle = inState.GetDataIndex("rhoTarget");
2971  int rhoETargetHandle = -1;
2972  int rhoVTargetHandle = -1;
2973  int scalarTargetHandle = -1;
2974 
2975  bool targetData = false;
2976  // If no acutal target data, then use the input state as the target
2977  if(rhoTargetHandle < 0){
2978  rhoTargetHandle = targetState.GetDataIndex("rho");
2979  rhoVTargetHandle = targetState.GetDataIndex("rhoV");
2980  rhoETargetHandle = targetState.GetDataIndex("rhoE");
2981  if(numScalar > 0){
2982  scalarTargetHandle = targetState.GetDataIndex("scalarVars");
2983  }
2984  } else {
2985  targetData = true;
2986  rhoVTargetHandle = inState.GetDataIndex("rhoVTarget");
2987  rhoETargetHandle = inState.GetDataIndex("rhoETarget");
2988  if(numScalar > 0){
2989  scalarTargetHandle = inState.GetDataIndex("scalarVarsTarget");
2990  }
2991  }
2992  if(rhoTargetHandle < 0 ||
2993  rhoVTargetHandle < 0 ||
2994  rhoETargetHandle < 0 ||
2995  (numScalar > 0 && scalarTargetHandle < 0)){
2996  std::cerr << "RHS Target Handles problem: " << rhoTargetHandle << " "
2997  << rhoVTargetHandle << " " << rhoETargetHandle << std::endl;
2998  return(1);
2999  }
3000 
3001  // Set up state field buffers if necessary
3002  if(targetData){
3003  targetState.SetFieldBuffer("rho",inState.GetRealFieldBuffer(rhoTargetHandle));
3004  targetState.SetFieldBuffer("rhoV",inState.GetRealFieldBuffer(rhoVTargetHandle));
3005  targetState.SetFieldBuffer("rhoE",inState.GetRealFieldBuffer(rhoETargetHandle));
3006  if(numScalar > 0)
3007  targetState.SetFieldBuffer("scalarVars",inState.GetRealFieldBuffer(scalarTargetHandle));
3008  }
3009 
3010  rhoTargetPtr = targetState.GetRealFieldBufferByHandle(rhoHandle);
3011  rhoVTargetPtr = targetState.GetRealFieldBufferByHandle(rhoVHandle);
3012  rhoETargetPtr = targetState.GetRealFieldBufferByHandle(rhoEHandle);
3013  if(numScalar > 0){
3014  scalarTargetPtr = targetState.GetRealFieldBufferByHandle(scalarHandle);
3015  }
3016 
3017  targetStateBuffers.resize(0);
3018  int numTargetVars = numEquations+1;
3019  targetStateBuffers.resize(numTargetVars,NULL);
3020 
3021  int iEquation = 0;
3022  targetStateBuffers[iEquation++] = rhoTargetPtr;
3023  for(int iDim = 0;iDim < numDim;iDim++)
3024  targetStateBuffers[iEquation++] = &rhoVTargetPtr[iDim*numPointsBuffer];
3025  targetStateBuffers[iEquation++] = rhoETargetPtr;
3026 
3027  if(numScalar > 0){
3028  for(int iScalar = 0;iScalar < numScalar;iScalar++)
3029  targetStateBuffers[iEquation++] = &scalarTargetPtr[iScalar*numPointsBuffer];
3030  }
3031 
3032  return(0);
3033 
3034  };
3035 
3036 
3037  int SetState(StateType &inState)
3038  {
3039  if(!stateInitialized)
3040  return(1);
3041 
3042  rhoPtr = inState.GetRealFieldBufferByHandle(rhoHandle);
3043  rhoVPtr = inState.GetRealFieldBufferByHandle(rhoVHandle);
3044  rhoEPtr = inState.GetRealFieldBufferByHandle(rhoEHandle);
3045 
3046  int iEquation = 0;
3047  myStateBuffers[iEquation++] = rhoPtr;
3048  for(int iDim = 0;iDim < numDim;iDim++)
3049  myStateBuffers[iEquation++] = &rhoVPtr[iDim*numPointsBuffer];
3050  myStateBuffers[iEquation++] = rhoEPtr;
3051 
3052  if(numScalar > 0){
3053  scalarPtr = inState.GetRealFieldBufferByHandle(scalarHandle);
3054  for(int iScalar = 0;iScalar < numScalar;iScalar++)
3055  myStateBuffers[iEquation++] = &scalarPtr[iScalar*numPointsBuffer];
3056  }
3057 
3058 
3059  // timePtr = inState.GetRealFieldBuffer(timeHandle);
3060  // time = *timePtr;
3061 
3062  // if(dtHandle >= 0){
3063  // dtPtr = inState.GetRealFieldBuffer(dtHandle);
3064  // }
3065  // if(cflHandle >= 0){
3066  // cflPtr = inState.GetRealFieldBuffer(cflHandle);
3067  // }
3068 
3069  return(0);
3070 
3071  };
3072 
3073  int SetRHSState(StateType &rhsState)
3074  {
3075 
3076  if(dRhoHandle < 0){
3077  dRhoHandle = rhsState.GetFieldHandle("rho");
3078  dRhoVHandle = rhsState.GetFieldHandle("rhoV");
3079  dRhoEHandle = rhsState.GetFieldHandle("rhoE");
3080  if(numScalar > 0)
3081  dScalarHandle = rhsState.GetFieldHandle("scalarVars");
3082  }
3083 
3084  rhoRHSPtr = rhsState.GetRealFieldBufferByHandle(dRhoHandle);
3085  rhoVRHSPtr = rhsState.GetRealFieldBufferByHandle(dRhoVHandle);
3086  rhoERHSPtr = rhsState.GetRealFieldBufferByHandle(dRhoEHandle);
3087 
3088  if(numScalar > 0)
3089  scalarRHSPtr = rhsState.GetRealFieldBufferByHandle(dScalarHandle);
3090  else
3091  scalarRHSPtr = NULL;
3092 
3093  int iEquation = 0;
3094  myRHSBuffers[iEquation++] = rhoRHSPtr;
3095  for(int iDim = 0;iDim < numDim;iDim++)
3096  myRHSBuffers[iEquation++] = &rhoVRHSPtr[numPointsBuffer*iDim];
3097  myRHSBuffers[iEquation++] = rhoERHSPtr;
3098  for(int iScalar = 0;iScalar < numScalar;iScalar++)
3099  myRHSBuffers[iEquation++] = &scalarRHSPtr[numPointsBuffer*iScalar];
3100 
3101  return(0);
3102 
3103  };
3104 
3105  // ============= Stencil & Operator utils ========
3106 
3107  // This routine *needs* to be thread-aware - but calling sequence needs to be
3108  // worked out. Currently is called before threads are initialized.
3111  {
3112 
3113  if(!operatorInitialized)
3114  return(1);
3115 
3116  int myThreadId = 0;
3117  int numThreads = 1;
3118 
3119  // #ifdef USE_OMP
3120  // myThreadId = omp_get_thread_num();
3121  // numThreads = omp_get_num_threads();
3122  // masterThread = (myThreadId == 0);
3123  // #endif
3124 
3125  // if(masterThread)
3126 
3127 #pragma omp master
3128  {
3129  if(!stencilConn){
3130  stencilConn = new int [numDim*numPointsBuffer];
3131  }
3132  if(artificialDissipation){
3133  artDissConn = new int [numDim*numPointsBuffer];
3134  artDissConnSplit = new int [numDim*numPointsBuffer];
3135  }
3136  if(!iMask){
3137  iMask = new int [numPointsBuffer];
3138  }
3139  }
3140 
3141  //#pragma omp barrier
3142 
3143  // Create stencil connectivity
3144  // if(numThreads == 1){
3145  // Only deals with actual domain boundaries - no holes
3147  boundaryDepth,&periodicDirs[0],
3148  stencilConn,true);
3149 
3150  if(artificialDissipation){
3152  artDissOperator.boundaryDepth,&periodicDirs[0],
3153  artDissConn,true);
3154 
3156  artDissOperatorSplit.boundaryDepth,&periodicDirs[0],
3157  artDissConnSplit,true);
3158  }
3159  // } else {
3160  // plascom2::operators::sbp::CreateStencilConnectivity(numDim,&bufferSizes[0],
3161  // &fortranPartitionBufferIntervals[myThreadId][0],
3162  // boundaryDepth,&periodicDirs[0],
3163  // stencilConn,true);
3164  // }
3165 
3166 
3167  // plascom2::operators::sbp::CreateStencilConnectivity(numDim,&gridSize[0],opInterval,boundaryDepth,stencilConn,true);
3168 
3169  // bug! unlike stencilConn, these need to be thread-specific
3170  // @todo Thread-specific dual stencil connectivities in RHS
3171  // Invert the connectivity
3172  // plascom2::operators::InvertStencilConnectivity(numDim,opInterval,stencilConn,dualStencilConn,true);
3173 
3174 
3175  // dualStencilConn = new size_t [numDim*numPointsBuffer]; // [DIM1[stencil1Points,stencil2Points....stencil(numStencils)Points]...]
3176  // numPointsStencil = new size_t [numDim*numStencils]; // [DIM1[numPoints1,numPoints2....numPoints(numStencils)]...]
3177 
3178  // plascom2::operators::sbp::InvertStencilConnectivity(numDim,&bufferSizes[0],&opInterval[0],numStencils,
3179  // stencilConn,dualStencilConn,numPointsStencil,true);
3180  return(0);
3181 
3182  };
3183 
3184 
3185  int SetupOperators(OperatorType &inOperator)
3186  {
3187 
3188  int myThreadId = 0;
3189  int numThreads = 1;
3190 
3191  // #ifdef USE_OMP
3192  // myThreadId = omp_get_thread_num();
3193  // masterThread = (myThreadId == 0);
3194  // #endif
3195  int errorCode = 0;
3196 
3197 #pragma omp master
3198  {
3199  // ==== Main differential operators ===
3200  if(!operatorInitialized){
3201  myOperator.Copy(inOperator);
3202 
3203  numStencils = myOperator.numStencils;
3204  stencilStarts = myOperator.stencilStarts;
3205  stencilOffsets = myOperator.stencilOffsets;
3206  stencilSizes = myOperator.stencilSizes;
3207  stencilWeights = myOperator.stencilWeights;
3208  boundaryDepth = myOperator.boundaryDepth;
3209  boundaryWeight = myOperator.boundaryWeight;
3210  numStencilValues = myOperator.numValues;
3211 
3212  // Forticate the stencil starts
3213  for(int iStencil = 0;iStencil < numStencils;iStencil++)
3214  stencilStarts[iStencil]++;
3215  operatorInitialized = true;
3216  // === artificial dissipation operators ===
3217  if(artificialDissipation){
3218  int interiorOrderAD = (myOperator.overallOrder-1)*2;
3219  if(plascom2::operators::dissipation::Initialize(artDissOperator,artDissOperatorSplit,interiorOrderAD)){
3220  std::cerr << "RHS ERROR: Artificial dissipation operator failed to initialize." << std::endl;
3221  errorCode = 1;
3222  operatorInitialized = false;
3223  } else {
3224  int *startPtr = artDissOperator.stencilStarts;
3225  int numStencilsAD = artDissOperator.numStencils;
3226  // Forticate the stencil starts
3227  for(int iStencil = 0;iStencil < numStencilsAD;iStencil++)
3228  startPtr[iStencil]++;
3229  startPtr = artDissOperatorSplit.stencilStarts;
3230  numStencilsAD = artDissOperator.numStencils;
3231  for(int iStencil = 0;iStencil < numStencilsAD;iStencil++)
3232  startPtr[iStencil]++;
3233  }
3234  }
3235  }
3236  }
3237 
3238  if(errorCode > 0){
3239  operatorInitialized = false;
3240  return(1);
3241  }
3242 
3243  //#pragma omp barrier
3244  if(SetupStencilConnectivities())
3245  return(1);
3246 
3247  gridPtr->SetupDifferentialOperator(&myOperator,&stencilConn[0]);
3248  std::ostringstream metricMessages;
3249  if(gridPtr->ComputeMetrics(metricMessages)){
3250  std::ostringstream failMessage;
3251  failMessage << "euler::rhs::SetupOperators: Error: grid::ComputeMetrics failed "
3252  << "with messages:" << std::endl << metricMessages.str() << std::endl;
3253  if(globalPtr){
3254  globalPtr->ErrOut(failMessage.str());
3255  } else {
3256  std::cout << failMessage.str();
3257  }
3258  return(1);
3259  } else {
3260  if(globalPtr){
3261  globalPtr->StdOut("Grid metric messages:\n",3);
3262  globalPtr->StdOut(metricMessages.str());
3263  } else {
3264  std::cout << "Grid metric messages:\n" << metricMessages.str() << std::endl;
3265  }
3266  }
3267  if(baseStatePtr){
3268  int gridMetricsHandle = baseStatePtr->GetDataIndex("gridMetrics");
3269  if(gridMetricsHandle >= 0){
3270  std::vector<double> gridMetric(gridPtr->Metric());
3271  baseStatePtr->SetFieldBuffer("gridMetrics",&gridMetric[0]);
3272  }
3273  }
3274 
3275  return(0);
3276 
3277  };
3278 
3279  // ====== Thread set up/handling =====
3280 
3282  {
3283  int myThreadId = 0;
3284  int numThreads = 1;
3285  bool inParallel = false;
3286 
3287 #ifdef USE_OMP
3288  inParallel = omp_in_parallel();
3289  if(inParallel){
3290  myThreadId = omp_get_thread_num();
3291  numThreads = omp_get_num_threads();
3292  }
3293 #endif
3294 
3295 #pragma omp master
3296  {
3297  fortranBufferIntervals.resize(numThreads);
3298  fortranPartitionBufferIntervals.resize(numThreads);
3299  }
3300 
3301  if(inParallel){
3302 #pragma omp barrier
3303  }
3304 
3305  std::vector<pcpp::IndexIntervalType> &threadPartitionBufferIntervals(gridPtr->ThreadPartitionBufferIntervals());
3306  if(threadPartitionBufferIntervals.size() != numThreads)
3307  return(1);
3308 
3309  threadPartitionBufferIntervals[myThreadId].Flatten(fortranPartitionBufferIntervals[myThreadId]);
3310 
3311  std::vector<pcpp::IndexIntervalType> &threadBufferIntervals(gridPtr->ThreadBufferIntervals());
3312  if(threadBufferIntervals.size() != numThreads)
3313  return(1);
3314  threadBufferIntervals[myThreadId].Flatten(fortranBufferIntervals[myThreadId]);
3315 
3316  // Forticate the thread intervals
3317  std::vector<size_t>::iterator opIt = fortranPartitionBufferIntervals[myThreadId].begin();
3318  while(opIt != fortranPartitionBufferIntervals[myThreadId].end()){
3319  *opIt += 1;
3320  opIt++;
3321  }
3322 
3323  std::vector<size_t>::iterator bufIt = fortranBufferIntervals[myThreadId].begin();
3324  while(bufIt != fortranBufferIntervals[myThreadId].end()){
3325  *bufIt += 1;
3326  bufIt++;
3327  }
3328 
3329  return(0);
3330 
3331  };
3332 
3333 
3334  // ====== Grid (and halo) handling =====
3335  int SetGrid(GridType &inGrid)
3336  {
3337 
3338  int numThreads = 1;
3339 
3340 #ifdef USE_OMP
3341  numThreads = omp_get_num_threads();
3342 #endif
3343 
3344  if(gridPtr != &inGrid){
3345 
3346  int myThreadId = 0;
3347 
3348 #ifdef USE_OMP
3349  myThreadId = omp_get_thread_num();
3350 #endif
3351 
3352 
3353 #pragma omp master
3354  {
3355 
3356  gridPtr = &inGrid;
3357  gridSizes = gridPtr->GridSizes();
3358  bufferSizes = gridPtr->BufferSizes();
3359  partitionInterval = gridPtr->PartitionInterval();
3360  partitionBufferInterval = gridPtr->PartitionBufferInterval();
3361  numPointsPartition = partitionInterval.NNodes();
3362  numDim = gridSizes.size();
3363  numPointsBuffer = gridPtr->BufferSize();
3364  gridCommPtr = &gridPtr->Communicator();
3365  subRegionsPtr = &gridPtr->SubRegions();
3366  gridCommPtr->CartNeighbors(gridNeighbors);
3367  gridType = gridPtr->Type();
3368 
3369  // std::vector<double> &gridJacobianVector(gridPtr->Jacobian());
3370  // std::vector<double> &gridMetricVector(gridPtr->Metric());
3371 
3372  // gridJacobian = &gridJacobianVector[0];
3373  // gridMetric = &gridMetricVector[0];
3374  // if(velHat)
3375  // delete [] velHat;
3376  // velHat = new double [numDim*numPointsBuffer];
3377  gridInitialized = true;
3378  // gridDX.resize(numDim,1.0);
3379  // gridDXM1.resize(numDim,1.0);
3380  // gridMetric.resize(numDim,1.0);
3381  // gridJacobian = 1.0;
3382  // std::vector<double> &dX(inGrid.DX());
3383  // std::vector<double>::iterator dXIt = dX.begin();
3384  // std::vector<double>::iterator gridDXIt = gridDX.begin();
3385  // std::vector<double>::iterator gridDXM1It = gridDXM1.begin();
3386  // while(dXIt != dX.end()){
3387  // double dx = *dXIt++;
3388  // *gridDXIt++ = dx;
3389  // *gridDXM1It++ = 1/dx;
3390  // gridJacobian *= 1/dx;
3391  // }
3392 
3393  // dXIt = dX.begin();
3394  // gridDXM1It = gridMetric.begin();
3395  // while(dXIt != dX.end()){
3396  // double dx = *dXIt++;
3397  // *gridDXM1It++ = 1.0/(dx*gridJacobian);
3398  // }
3399 
3400  partitionBufferInterval.Flatten(opInterval);
3401 
3402  // Forticate the opInterval
3403  std::vector<size_t>::iterator opIt = opInterval.begin();
3404  while(opIt != opInterval.end()){
3405  *opIt += 1;
3406  opIt++;
3407  }
3408  }
3409  // Reset the thread intervals for this grid
3410  InitThreadIntervals();
3411  }
3412 
3413  // else if ((numThreads > 1) && !threadsInitialized) { // JIC not already done
3414  // InitThreadIntervals();
3415  // }
3416  return(0);
3417  };
3418 
3419 
3420  int HaloSetup(HaloType &inHalo)
3421  {
3422 
3423 #pragma omp master
3424  {
3425  SetHalo(inHalo);
3426  periodicDirs = inHalo.PeriodicDirs();
3427  if(periodicDirs.empty()){
3428  periodicDirs.resize(numDim,1);
3429  }
3430  // int pDim = periodicDirs.size();
3431  // std::cout << "Periodic(";
3432  // for(int iDim = 0;iDim < pDim;iDim++){
3433  // if(iDim > 0) std::cout << ",";
3434  // std::cout << periodicDirs[iDim];
3435  // }
3436  // std::cout << ")" << std::endl;
3437 
3438  maskMessageId = inHalo.CreateMessageBuffers(1,4);
3439  if(exchangeDV)
3440  dvMessageId = inHalo.CreateMessageBuffers(numDV);
3441  if(exchangeFlux)
3442  fluxMessageId = inHalo.CreateMessageBuffers(numEquations);
3443  scalarMessageId = inHalo.CreateMessageBuffers(1);
3444  }
3445  return(0);
3446  };
3447 
3448  int SetHalo(HaloType &inHalo)
3449  {
3450  haloPtr = &inHalo;
3451  return(0);
3452  };
3453 
3454 
3455  // ===== Boundary related stuff ====
3456 
3457  // This function sets the domainBoundaries data structure *and* goes
3458  // through the stencilConnectivity to assign boundary stencils. It is
3459  // redundant for the actual grid/domain boundaries, but boundary stencils
3460  // for internal boundaries are set here.
3461  // Threaded fail
3463  void SetDomainBCs(std::vector<BoundaryType> &domainBoundaries,std::vector<BCType> &domainBCs)
3464  {
3465 
3466  domainBCsPtr = &domainBCs;
3467  domainBoundariesPtr = &domainBoundaries;
3468  assert(subRegionsPtr != NULL);
3469 
3470  std::vector<GridRegionType> &gridRegions(*subRegionsPtr);
3471 
3472  int numBCs = domainBCs.size();
3473  int numGridRegions = gridRegions.size();
3474  int numDomainBoundaries = domainBoundaries.size();
3475  int holeStencil = myOperator.numStencils;
3476  int adHole = artDissOperator.numStencils;
3477  int adSplitHole = artDissOperatorSplit.numStencils;
3478  int adBoundaryDepth = artDissOperator.boundaryDepth;
3479  int adSplitBoundaryDepth = artDissOperatorSplit.boundaryDepth;
3480 
3481  // std::cout << "Boundary stencil processing report: " << std::endl
3482  // << "HoleStencil: " << holeStencil << std::endl
3483  // << "ADHoleStencil: " << adHole << std::endl
3484  // << "ADSplitHole: " << adSplitHole << std::endl
3485  // << "ADBoundaryDepth: " << adBoundaryDepth << std::endl
3486  // << "ADBoundaryDepthS: " << adSplitBoundaryDepth << std::endl;
3487 
3488  // if(numBCs == 0)
3489  // return;
3490  // if(numDomainBoundaries == 0)
3491  // return;
3492 
3493 
3495  std::vector<size_t> partitionBufferExtent;
3496  partitionBufferInterval.Flatten(partitionBufferExtent);
3497 
3498 
3499  // Initialize the mask to zero
3500  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++)
3501  iMask[iPoint] = 0;
3502  bool haveHoles = false;
3503 
3504  // Check for legacy IBLANK (0 = hole)
3505  size_t numHoles = gridPtr->FlagMask(iMask,0,holeMask);
3506  size_t numHolesGrid = 0;
3507  gridCommPtr->AllReduce(numHolesGrid,numHoles,ix::comm::DTSIZET,ix::comm::SUMOP);
3508  if(numHolesGrid > 0){
3509  haveHoles = true;
3510  }
3511 
3512  // First, loop through all holes and create the iMask
3513  typename std::vector<BoundaryType>::iterator dbIt = domainBoundaries.begin();
3514  while(dbIt != domainBoundaries.end()){
3515  BoundaryType &domainBoundary(*dbIt++);
3516  GridRegionType &gridRegion(gridRegions[domainBoundary.GridRegionID()]);
3517 
3518  int boundaryNormalDirection = gridRegion.normalDirection;
3519  pcpp::IndexIntervalType &boundaryPartitionInterval(gridRegion.regionPartitionInterval);
3520 
3521  int returnCode = 0;
3522  BCType &boundaryCondition(domainBoundary.BC());
3523  // unique int id for bc
3524  int bcType = boundaryCondition.BCType();
3525 
3526  if(bcType == navierstokes::HOLE) {
3527  // set hole bits in mask
3528  haveHoles = true;
3530  boundaryPartitionInterval.RelativeTranslation(partitionInterval,
3531  partitionBufferInterval,
3532  opInterval);
3533  if(opInterval.NNodes() > 0) {
3534  std::vector<size_t> opExtents;
3535  opInterval.Flatten(opExtents);
3536  mask::SetMask(bufferSizes,opInterval,holeMask,iMask);
3537  }
3538  }
3539  }
3540 
3541  // MJA
3542  // Bug here? Only needed for artificial dissipation
3543  //
3544  // std::cout << "passed this part" << std::endl;
3545  if(haveHoles){
3546 
3547  int returnCode = 0;
3548 
3549  haloPtr->PackMessageBuffers(maskMessageId,0,1,iMask);
3550  haloPtr->SendMessage(maskMessageId,gridNeighbors,*gridCommPtr);
3551  haloPtr->ReceiveMessage(maskMessageId,gridNeighbors,*gridCommPtr);
3552  haloPtr->UnPackMessageBuffers(maskMessageId,0,1,iMask);
3553 
3554  returnCode = plascom2::operators::sbp::DetectHoles(numDim,&bufferSizes[0],&partitionBufferExtent[0],
3555  boundaryDepth,holeMask,iMask,stencilConn);
3556 
3557 
3558  if(artificialDissipation){
3559  returnCode = plascom2::operators::sbp::DetectHoles(numDim,&bufferSizes[0],&partitionBufferExtent[0],
3560  adBoundaryDepth,holeMask,iMask,artDissConn);
3561  returnCode = plascom2::operators::sbp::DetectHoles(numDim,&bufferSizes[0],&partitionBufferExtent[0],
3562  adSplitBoundaryDepth,holeMask,iMask,artDissConnSplit);
3563  }
3564  if(returnCode){
3565  std::string errorMessage("rhs::SetDomainBCs:Error: Hole detection failed.\n");
3566  if(globalPtr){
3567  globalPtr->ErrOut(errorMessage);
3568  } else {
3569  std::cerr << errorMessage;
3570  }
3571  }
3572  }
3573 
3574  };
3575 
3576  // == auxiliary methods ==
3577  int InitStep(GridType &inGrid,StateType &inState)
3578  {
3579  return(0);
3580  };
3581  virtual int ProcessInterior2(GridType &inGrid,StateType &inState,StateType &rhsState)
3582  { return(0); };
3583  virtual int ProcessHalo(HaloType &inHalo,GridType &inGrid,StateType &inState,StateType &rhsState)
3584  { return(0); };
3585  virtual int ProcessInterior(GridType &inGrid,StateType &inState,StateType &rhsState)
3586  { return(0); };
3587  virtual int ProcessBoundary(GridType &inGrid,StateType &inState,StateType &rhsState)
3588  { return(0); };
3589 
3590  std::vector<double *> &DVBuffers()
3591  { return(dvBuffers); };
3592  std::vector<double *> &TVBuffers()
3593  { return(tvBuffers); };
3594  std::vector<double *> &StateBuffers()
3595  { return(myStateBuffers); };
3596  std::vector<double *> &RHSBuffers()
3597  { return(myRHSBuffers); };
3599  { return(inviscidFluxBuffer); };
3600  double *DFluxBuffer()
3601  { return(dFluxBuffer); };
3603  { return(numEquations); };
3604 
3605 
3607  { return(coeffsWENO); };
3608  std::vector<double *> &VelGradBuffers()
3609  { return(velGradBuffers); };
3610  std::vector<double *> &TemperatureGradBuffers()
3611  { return(temperatureGradBuffers); };
3612 
3614  {
3615 #pragma omp master
3616  {
3617  minSpacing.resize(numDim,std::numeric_limits<double>::max());
3618  // if(gridType < simulation::grid::RECTILINEAR){
3619  if(true){
3620  for(int iDim = 0;iDim < numDim;iDim++){
3621  minSpacing[iDim] = gridDX[iDim];
3622  }
3623 
3624  // } else {
3625  // std::vector<double> &coordinateData(gridPtr->CoordinateData());
3626  // std::vector<size_t> dimOffset(numDim,0);
3627  // for(int iDim = 0;iDim < numDim;iDim++)
3628  // dimOffset[iDim] = iDim * numPointsBuffer;
3629 
3630  // pcpp::IndexIntervalType globalInterval;
3631  // globalInterval.InitSimple(gridSizes);
3632  // std::vector<size_t> partitionPointIndices;
3633  // globalInterval.GetFlatIndices(partitionBufferInterval,partitionPointIndices);
3634  // std::vector<size_t>::iterator pointIt = partitionPointIndices.begin();
3635  // while(pointIt != partitionPointIndices.end()){
3636  // size_t bufferIndex = *pointIt++;
3637  // for(int iDim = 0;iDim < numDim;iDim++){
3638  // if(coordinateData[bufferIndex+dimOffset[iDim]] < minSpacing[iDim])
3639  // minSpacing[iDim] = coordinateData[bufferIndex+dimOffset[iDim]];
3640  // }
3641  // }
3642  }
3643  }
3644  };
3645 
3646  // Must be called on all threads
3647  double TimeStep(double *outCFL = NULL)
3648  {
3649  // if(minSpacing.empty())
3650  // InitMinSpacing();
3651  // double spaceFactor = 0.0;
3652  // for(int iDim = 0;iDim < numDim;iDim++)
3653  // spaceFactor += 1.0/(minSpacing[iDim]);
3654 
3655  *dtPtr = 0;
3656  if(timeSteppingMode == CONSTANT_DT){
3657 #pragma omp master
3658  {
3659  if(*dtPtr != inputDT){
3660  *dtPtr = inputDT;
3661  *cflPtr = *dtPtr;
3662  // *cflPtr = refSndSpd*(*dtPtr)*spaceFactor;
3663  }
3664  }
3665 #pragma omp barrier
3666  if(outCFL != NULL){
3667  *outCFL = *cflPtr;
3668  }
3669  }
3670  // else if (timeSteppingMode == CONSTANT_CFL){
3671 
3672  // #pragma omp master
3673  // {
3674  // if(*cflPtr != inputCFL){
3675  // *cflPtr = inputCFL;
3676  // *dtPtr = *cflPtr/(refSndSpd*spaceFactor);
3677  // }
3678  // }
3679  // #pragma omp barrier
3680 
3681  // }
3682  return(*dtPtr);
3683  };
3684 
3685  private:
3686  int Init()
3687  {
3688 
3689  int myThreadId = 0;
3690  int numThreads = 1;
3691 
3692 #ifdef USE_OMP
3693  myThreadId = omp_get_thread_num();
3694  numThreads = omp_get_num_threads();
3695 #endif
3696 
3697 #pragma omp master
3698  {
3699  myCFL = 1.0;
3700  myDT = 0.0;
3701 
3702  // if(masterThread){
3703  // Conserved state
3704  rhoHandle = -1;
3705  rhoVHandle = -1;
3706  rhoEHandle = -1;
3707  scalarHandle = -1;
3708  dRhoHandle = -1;
3709  dRhoVHandle = -1;
3710  dRhoEHandle = -1;
3711  dScalarHandle = -1;
3712 
3713  // Dependent state
3714  temperatureHandle = -1;
3715  pressureHandle = -1;
3716  gradVHandle = -1;
3717  gradTHandle = -1;
3718 
3719  // Parameters
3720  gammaHandle = -1;
3721  cflHandle = -1;
3722  dtHandle = -1;
3723  numScalar = 0;
3724  sigmaHandle = -1;
3725  cHandle = -1;
3726  reHandle = -1;
3727  cpHandle = -1;
3728  gasModel = 0;
3729  transportModel = 0;
3730  gridType = 0;
3731 
3732  // Optional data handles
3733  velocityHandle = -1;
3734  rhom1Handle = -1;
3735  internalEnergyHandle = -1;
3736 
3737  // Misc
3738  numPointsPartition = 0;
3739  numPointsBuffer = 0;
3740  numDim = 0;
3741  numStateFields = 3;
3742  numDV = 6;
3743  numStateVar = 5;
3744  baseStatePtr = NULL;
3745  gridPtr = NULL;
3746  cPtr = NULL;
3747  rePtr = NULL;
3748  cpPtr = NULL;
3749  timePtr = NULL;
3750  rhoPtr = NULL;
3751  rhoVPtr = NULL;
3752  rhoEPtr = NULL;
3753  scalarPtr = NULL;
3754  rhoTargetPtr = NULL;
3755  rhoVTargetPtr = NULL;
3756  rhoETargetPtr = NULL;
3757  scalarTargetPtr = NULL;
3758  pressurePtr = NULL;
3759  temperaturePtr = NULL;
3760  rhoRHSPtr = NULL;
3761  rhoVRHSPtr = NULL;
3762  rhoERHSPtr = NULL;
3763  scalarRHSPtr = NULL;
3764  massFluxPtr = NULL;
3765  momentumFluxPtr = NULL;
3766  energyFluxPtr = NULL;
3767  scalarFluxPtr = NULL;
3768  fluxComponentPtr = NULL;
3769  velocityPtr = NULL;
3770  rhom1Ptr = NULL;
3771  internalEnergyPtr = NULL;
3772  massSourcePtr = NULL;
3773  momentumSourcePtr = NULL;
3774  energySourcePtr = NULL;
3775  scalarSourcePtr = NULL;
3776  dvBuffer = NULL;
3777  viscidFluxBuffer = NULL;
3778  inviscidFluxBuffer = NULL;
3779  dFluxBuffer = NULL;
3780  // scaledPressure = NULL;
3781  scaledTau = NULL;
3782  velHat = NULL;
3783  viscidEnergy = NULL;
3784  velGradBufferPtr = NULL;
3785  velDiv = NULL;
3786  sigmaDissipation = NULL;
3787  alphaDissipation = NULL;
3788  scalarGrad = NULL;
3789  tempVector = NULL;
3790  tempScalar = NULL;
3791  inputDiffusivity = NULL;
3792  scalarDiffusivity = NULL;
3793  // EOS
3794  eosPtr = NULL;
3795 
3796  temperatureGradBufferPtr = NULL;
3797  cflPtr = &myCFL;
3798  dtPtr = &myDT;
3799  timeSteppingMode = CONSTANT_DT;
3800 
3801  // BCs-related
3802  subRegionsPtr = NULL;
3803  domainBoundariesPtr = NULL;
3804  domainBCsPtr = NULL;
3805 
3806  // Operator-related
3807  stencilConn = NULL;
3808  artDissConn = NULL;
3809  artDissConnSplit = NULL;
3810  iMask = NULL;
3811 
3812  // dvBuffers = NULL;
3813  // fluxBuffers = NULL;
3814  stateInitialized = false;
3815  gridInitialized = false;
3816  threadsInitialized = false;
3817  operatorInitialized = false;
3818  errorCode = 0;
3819 
3820  dvMessageId = -1;
3821  fluxMessageId = -1;
3822  maskMessageId = -1;
3823  scalarMessageId = -1;
3824 
3825  }
3826  return 0;
3827  };
3828 
3829  // public:
3830  // ~rhs()
3831  // {
3832  // std::cout << "Enter destructor" << std::endl;
3833  // if(fluxBuffer)
3834  // delete [] fluxBuffer;
3835  // if(dFluxBuffer)
3836  // delete [] dFluxBuffer;
3837  // if(scaledPressure)
3838  // delete [] scaledPressure;
3839  // for(int iDV = 0;iDV < numDV;iDV++)
3840  // if(dvBuffersMine[iDV])
3841  // delete [] dvBuffers[iDV];
3842  // if(velHat)
3843  // delete [] velHat;
3844  // std::cout << "Exit destructor" << std::endl;
3845  // };
3846 
3847  protected:
3848 
3849  // State ptr
3850  StateType *baseStatePtr;
3851 
3852  // Data handles
3879  int cHandle;
3882 
3883  // Parameters
3884  double time;
3885  double myDT;
3886  double myCFL;
3887  double inputCFL;
3888  double inputDT;
3889 
3891  // transport model specific
3892  double power;
3893  double beta;
3894  double bulkViscFac;
3896  double refPressure;
3897  double refRho;
3898  double refEnergy;
3899  double cfl;
3900  double refSndSpd;
3901  double refVelocity;
3902  double refLength;
3903  double refCp;
3904  double refCv;
3905  double refRe;
3906  double refPr;
3907  double refMu;
3908  double refKappa;
3914  double inputSigma;
3916 
3919  const double *powerPtr;
3920  const double *betaPtr;
3921  const double *bulkViscFacPtr;
3922  const double *timePtr;
3923  // const double *cflPtr;
3924  const double *sigmaPtr;
3925  const double *sigmaDilPtr;
3926  const double *cPtr;
3927  const double *rePtr;
3928  const double *prPtr;
3929  const double *cpPtr;
3930  const double *inputDiffusivity;
3931 
3935  int numDV;
3936  int numTV;
3938 
3939  // Grid data
3940  GridType *gridPtr;
3941  // StateType *targetStatePtr;
3942  // StateType targetState;
3944  std::vector<int> gridNeighbors;
3945  int numDim;
3946  std::vector<size_t> gridSizes;
3947  std::vector<size_t> bufferSizes;
3952  std::vector<double> gridDX;
3953  std::vector<double> gridDXM1;
3954  std::vector<double> minSpacing;
3956 
3958  std::vector<double> gridMetric;
3959 
3960  std::vector<int> periodicDirs;
3961  std::vector<size_t> opInterval;
3962  HaloType *haloPtr;
3963  std::vector<std::vector<size_t> > fortranBufferIntervals;
3964  std::vector<std::vector<size_t> > fortranPartitionBufferIntervals;
3965  StateType targetState;
3966  StateType rhsState;
3967 
3968 
3969  // input State information
3970  double *rhoPtr;
3971  double *rhoVPtr;
3972  double *rhoEPtr;
3973  double *scalarPtr;
3974 
3975  double *rhoTargetPtr;
3976  double *rhoVTargetPtr;
3977  double *rhoETargetPtr;
3979  double *pressurePtr;
3981  double *muPtr;
3982  double *lambdaPtr;
3983  double *kappaPtr;
3985 
3986  double *dtPtr;
3987  double *cflPtr;
3988 
3989  // rhs State information
3990  double *rhoRHSPtr;
3991  double *rhoVRHSPtr;
3992  double *rhoERHSPtr;
3993  double *scalarRHSPtr;
3994 
3995  // flux storage
3996  double *massFluxPtr;
3998  double *energyFluxPtr;
3999  double *scalarFluxPtr;
4001 
4002  // Auxiliary data
4003  double *velocityPtr;
4004  double *rhom1Ptr;
4006  double *velHat;
4007  double *viscidEnergy;
4008  double *velDiv;
4011 
4012  // Source data
4013  double *massSourcePtr;
4017 
4018  // Halo data storage
4019  std::vector< std::vector<double *> > haloDVBuffers;
4020  std::vector< std::vector<double *> > haloFluxBuffers;
4021  std::vector<std::vector<double *> > haloStateBuffers;
4022 
4023  // My storage
4024  std::vector<bool> dvBuffersMine;
4025  std::vector<double *> dvBuffers;
4026  std::vector<double *> tvBuffers;
4027  std::vector<double *> inviscidFluxBuffers;
4028  std::vector<double *> viscidFluxBuffers;
4029  std::vector<double *> dFluxBuffers;
4030  std::vector<double *> myStateBuffers;
4031  std::vector<double *> targetStateBuffers;
4032  std::vector<double *> myRHSBuffers;
4033  std::vector<double *> velGradBuffers; // dv_i/dx_j
4034  std::vector<double *> temperatureGradBuffers; // dT/dx_i
4035  std::vector<double *> tauBuffers;
4036  std::vector<double *> heatFluxBuffers;
4037  double *dvBuffer;
4038  double *tvBuffer;
4041  double *dFluxBuffer;
4042  // double *scaledPressure;
4043  double *scaledTau;
4046  double *tauBufferPtr;
4048  double *scalarGrad;
4049  double *tempVector;
4050  double *tempScalar;
4051 
4052  // Operator
4053  OperatorType myOperator;
4054  OperatorType artDissOperator;
4055  OperatorType artDissOperatorSplit;
4056 
4065  int *iMask;
4070 
4071  // bookkeeping
4076  std::vector<bool> haveHalo;
4078 
4079  // message Ids
4084  // int numDVMessageComponents;
4086 
4087  // Boundary condition support
4088  std::vector<GridRegionType> *subRegionsPtr;
4089  std::vector<BoundaryType> *domainBoundariesPtr;
4090  std::vector<BCType> *domainBCsPtr;
4092 
4093  // Processing options
4094  // bool useAlternateRHS;
4098  bool useWENO;
4099 
4100  // WENO data structures
4102 
4103  // equation of state
4107 
4108  };
4109 
4110 }
4111 #endif
int HandleSources(const pcpp::IndexIntervalType &regionInterval)
Definition: EulerRHS.H:810
void const size_t const size_t const size_t const int const int const double * gridMetric
Definition: EulerKernels.H:10
int * stencilStarts
Definition: EulerRHS.H:4066
int scalarHandle
Definition: EulerRHS.H:3859
double cfl
Definition: EulerRHS.H:3899
static const int EXCHANGEDV
Definition: EulerRHS.H:24
int gasModel
Definition: EulerRHS.H:3917
int dRhoEHandle
Definition: EulerRHS.H:3858
subroutine vhatcomponent(numDim, numPointsBuffer, bufferSizes, opInterval, gridType, gridMetric, velDir, velocity, velHatComponent)
Definition: MetricOps.f90:59
int ComputeDVBuffer(const pcpp::IndexIntervalType &regionInterval, const std::vector< size_t > &bufferSizes, const std::vector< double *> &stateBuffers, std::vector< double *> &dvBuffers)
Definition: EulerUtil.C:153
double * inviscidFluxBuffer
Definition: EulerRHS.H:4039
#define CONSTANT_DT
Definition: EulerRHS.H:31
std::vector< double * > & RHSBuffers()
Definition: EulerRHS.H:3596
subroutine assignmentyx(numDim, numPoints, bufferSize, bufferInterval, X, Y)
ASSIGNMENTYX point-wise operator performing Y = X.
Definition: Operators.f90:1170
double * velHat
Definition: EulerRHS.H:4006
std::vector< double * > velGradBuffers
Definition: EulerRHS.H:4033
int SetTargetState(StateType &inState)
Definition: EulerRHS.H:2963
double * scalarTargetPtr
Definition: EulerRHS.H:3978
int SetupOperators(OperatorType &inOperator)
Definition: EulerRHS.H:3185
int ComputeTauBuffer(const pcpp::IndexIntervalType &regionInterval, const std::vector< size_t > &bufferSize, int gridType, const std::vector< double > &gridMetrics, const std::vector< double > &gridJacobian, const double &Re, const std::vector< double *> &tvBuffers, const std::vector< double *> &velGradBuffers, std::vector< double *> &tauBuffers)
Definition: ViscidUtil.C:113
std::vector< BCType > * domainBCsPtr
Definition: EulerRHS.H:4090
double * dtPtr
Definition: EulerRHS.H:3986
subroutine noslip_isothermal(numDim, bufferSizes, numPointsBuffer, patchNormalDir, patchSizes, numPointsPatch, numPatchPointsOp, patchPointsOp, gridType, gridMetric, jacobianDeterminant, bcParams, gasParams, rhoBuffer, rhoVBuffer, rhoEBuffer, numscalar, scalarBuffer, rhoRHS, rhoVRHS, rhoERHS, scalarRHS, rhoTarget, rhoVTarget, rhoETarget, scalarTarget, muBuffer, lambdaBuffer)
Definition: SATUtil.f90:727
subroutine dissipationweight(numDim, bufferSize, numPoints, bufferInterval, sigmaDissipation, sigmaDilatation, dilatationRamp, dilatationCutoff, divV, sigmaDiss)
Definition: SATUtil.f90:1872
double boundaryWeight
Definition: EulerRHS.H:4091
double * sigmaDissipation
Definition: EulerRHS.H:4009
const double * betaPtr
Definition: EulerRHS.H:3920
subroutine ywxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y)
YWXPY point-wise operator performing Y = WX + Y, where all are vectors.
Definition: Operators.f90:835
static const int VEFLUX
Definition: EulerRHS.H:46
int numScalar
Definition: EulerRHS.H:3932
double refKappa
Definition: EulerRHS.H:3908
int tauCounter
Definition: EulerRHS.H:4106
int bulkViscFacHandle
Definition: EulerRHS.H:3865
static const int XANGE
Definition: EulerRHS.H:43
HaloType * haloPtr
Definition: EulerRHS.H:3962
std::vector< int > gridNeighbors
Definition: EulerRHS.H:3944
const std::string & Name() const
Definition: Boundary.H:193
int numDim
Definition: EulerRHS.H:3945
int InitStep(GridType &inGrid, StateType &inState)
Definition: EulerRHS.H:3577
double bulkViscFac
Definition: EulerRHS.H:3894
int ComputeTV(int threadId)
Definition: EulerRHS.H:1254
void size_t int size_t int size_t int int * stencilSizes
int cHandle
Definition: EulerRHS.H:3879
std::vector< double > minSpacing
Definition: EulerRHS.H:3954
double * tauBufferPtr
Definition: EulerRHS.H:4046
void GetFlatIndices(const sizeextent &extent, ContainerType &indices) const
Definition: IndexUtil.H:302
double refRho
Definition: EulerRHS.H:3897
int scalarMessageId
Definition: EulerRHS.H:4083
int Initialize(GridType &inGrid, StateType &inState, StateType &inParam, OperatorType &inOperator)
Definition: EulerRHS.H:87
double * velDiv
Definition: EulerRHS.H:4008
int RHS(int threadId)
Definition: EulerRHS.H:355
int dRhoHandle
Definition: EulerRHS.H:3856
std::vector< double > gridMetric
Definition: EulerRHS.H:3958
int Init()
Definition: EulerRHS.H:3686
int InitializeState(StateType &inState)
Definition: EulerRHS.H:2523
double * momentumSourcePtr
Definition: EulerRHS.H:4014
double * rhoETargetPtr
Definition: EulerRHS.H:3977
static const int VELGRAD
Definition: EulerRHS.H:36
double * rhoRHSPtr
Definition: EulerRHS.H:3990
double refVelocity
Definition: EulerRHS.H:3901
std::vector< size_t > opInterval
Definition: EulerRHS.H:3961
std::vector< int > & PeriodicDirs()
Definition: Grid.H:160
static const int ARTDISS
Definition: EulerRHS.H:25
pcpp::IndexIntervalType partitionInterval
Definition: EulerRHS.H:3948
void Flatten(ContainerType &output) const
Definition: IndexUtil.H:274
std::vector< bool > dvBuffersMine
Definition: EulerRHS.H:4024
StateT StateType
Definition: EulerRHS.H:64
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double double * X
double specGasConst
Definition: EulerRHS.H:3913
int numStencilValues
Definition: EulerRHS.H:4059
void UnpackDVMessage(int threadId)
Definition: EulerRHS.H:1821
double * tempScalar
Definition: EulerRHS.H:4050
static const int VFLUX
Definition: EulerRHS.H:45
int numStateFields
Definition: EulerRHS.H:3933
void double double double double double double double *void const size_t const size_t const size_t const double const double const double const double const double double * sigmaDiss
Definition: SATKernels.H:48
GridT GridType
Definition: EulerRHS.H:63
std::vector< std::vector< size_t > > fortranPartitionBufferIntervals
Definition: EulerRHS.H:3964
double * temperatureGradBufferPtr
Definition: EulerRHS.H:4045
void size_t int size_t int size_t int int int int double int int double * uBuffer
double * fluxComponentPtr
Definition: EulerRHS.H:4000
bool threadsInitialized
Definition: EulerRHS.H:4074
int ViscousFlux(int iDim, int threadId)
Definition: EulerRHS.H:1699
int SetupStencilConnectivities()
Definition: EulerRHS.H:3110
double * rhoPtr
Definition: EulerRHS.H:3970
double * heatFluxBufferPtr
Definition: EulerRHS.H:4047
rhs_base_t::BoundaryType BoundaryType
Definition: EulerRHS.H:68
subroutine applyoperator(numDim, dimSizes, numComponents, numPoints, opDir, opInterval, numStencils, stencilSizes, stencilStarts, numValues, stencilWeights, stencilOffsets, stencilID, U, dU)
applyoperator applies an operator specified as a stencil set to the provided state data ...
Definition: Operators.f90:36
OperatorType myOperator
Definition: EulerRHS.H:4053
std::vector< double * > dFluxBuffers
Definition: EulerRHS.H:4029
double * kappaPtr
Definition: EulerRHS.H:3983
int cflHandle
Definition: EulerRHS.H:3867
double * scalarFluxPtr
Definition: EulerRHS.H:3999
double * temperaturePtr
Definition: EulerRHS.H:3980
double * scalarDiffusivity
Definition: EulerRHS.H:3984
double time
Definition: EulerRHS.H:3884
double refRe
Definition: EulerRHS.H:3905
std::vector< std::vector< size_t > > fortranBufferIntervals
Definition: EulerRHS.H:3963
std::vector< size_t > bufferSizes
Definition: EulerRHS.H:3947
Definition: Euler.f90:1
virtual int ProcessBoundary(GridType &inGrid, StateType &inState, StateType &rhsState)
Definition: EulerRHS.H:3587
bool operatorInitialized
Definition: EulerRHS.H:4075
std::vector< std::vector< double * > > haloDVBuffers
Definition: EulerRHS.H:4019
TRANSPORTMODELS
Definition: EulerRHS.H:53
double * scalarPtr
Definition: EulerRHS.H:3973
double myDT
Definition: EulerRHS.H:3885
rhs_base_t::BCType BCType
Definition: EulerRHS.H:69
int rhoVHandle
Definition: EulerRHS.H:3854
double * rhoVPtr
Definition: EulerRHS.H:3971
int sigmaHandle
Definition: EulerRHS.H:3866
void ReconstPointVal(double vals[], CoeffsWENO &coeffs, int group, double &pVal)
Definition: WENO.C:11
double refCp
Definition: EulerRHS.H:3903
int ExchangeState(int threadId)
Definition: EulerRHS.H:1904
void ExchangeDVMessage()
Definition: EulerRHS.H:1830
int ComputeHeatFluxBuffer(const pcpp::IndexIntervalType &regionInterval, const std::vector< size_t > &bufferSize, int gridType, const std::vector< double > &gridMetrics, const std::vector< double > &gridJacobian, const double &Re, const std::vector< double *> &tvBuffers, const std::vector< double *> &temperatureGradBuffers, std::vector< double *> &heatFluxBuffers)
Definition: ViscidUtil.C:627
int kappaHandle
Definition: EulerRHS.H:3873
std::vector< double * > dvBuffers
Definition: EulerRHS.H:4025
OperatorT OperatorType
Definition: EulerRHS.H:65
virtual int ProcessInterior(GridType &inGrid, StateType &inState, StateType &rhsState)
Definition: EulerRHS.H:3585
double inputSigma
Definition: EulerRHS.H:3914
double * rhoVRHSPtr
Definition: EulerRHS.H:3991
void size_t int size_t int size_t int int int * stencilStarts
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
double * stencilWeights
Definition: EulerRHS.H:4067
int cpHandle
Definition: EulerRHS.H:3881
double EntropyFixEta(int n, double lambdaL[], double lambdaR[])
Definition: WENO.C:113
void RenewStream(std::ostringstream &outStream)
double * dFluxBuffer
Definition: EulerRHS.H:4041
double inputDT
Definition: EulerRHS.H:3888
double * internalEnergyPtr
Definition: EulerRHS.H:4005
simulation::grid::subregion GridRegionType
Definition: EulerRHS.H:55
void const size_t const size_t const size_t const int const int const double const double const double const double const double * velHat
Definition: EulerKernels.H:10
void GridScaleRHS(int threadId)
Definition: EulerRHS.H:1139
WENO::CoeffsWENO & WENOCoefficients()
Definition: EulerRHS.H:3606
static const int VELDIV
Definition: EulerRHS.H:37
static const int IFLUX
Definition: EulerRHS.H:44
int PrepareBuffers(int threadId)
Definition: EulerRHS.H:313
void const size_t const size_t const size_t const int const int * gridType
Definition: EulerKernels.H:10
int timeHandle
Definition: EulerRHS.H:3861
double refSndSpd
Definition: EulerRHS.H:3900
static const int holeMask
Definition: EulerRHS.H:28
void SpongeZone(const std::vector< size_t > &bufferSizes, int normalDir, const pcpp::IndexIntervalType &spongeRegion, const pcpp::IndexIntervalType &partitionOpInterval, const pcpp::IndexIntervalType &opBufferInterval, const double *bcParams, const int *bcFlags, const int *iMask, const int disabledMask, const int numEquations, const std::vector< double *> &stateBuffers, const std::vector< double *> &targetBuffers, std::vector< double *> &rhsBuffers)
int * stencilConn
Definition: EulerRHS.H:4062
int ComputeTemperatureGrad(int threadId)
Definition: EulerRHS.H:1561
StateType targetState
Definition: EulerRHS.H:3965
void const size_t const size_t const size_t * opInterval
Definition: EulerKernels.H:10
StateType rhsState
Definition: EulerRHS.H:3966
subroutine yxy(numDim, numPoints, bufferSize, bufferInterval, X, Y)
YXY point-wise operator performing Y = XY (all vectors)
Definition: Operators.f90:731
subroutine scalarflux1d(numDim, numPoints, gridSizes, opInterval, numScalars, scalarBuffer, velHat, fluxBuffer)
Flux for scalar transport.
Definition: Euler.f90:463
int dtHandle
Definition: EulerRHS.H:3868
std::vector< double * > myStateBuffers
Definition: EulerRHS.H:4030
int numStencils
Definition: EulerRHS.H:4057
int HandleSources(int myThreadId)
Definition: EulerRHS.H:814
size_t numPointsBuffer
Definition: EulerRHS.H:3951
const double * powerPtr
Definition: EulerRHS.H:3919
void const size_t const size_t const size_t const int const double const int const double * velocity
Definition: MetricKernels.H:19
int * artDissConnSplit
Definition: EulerRHS.H:4064
GridType * gridPtr
Definition: EulerRHS.H:3940
subroutine assignmentxa(numDim, numPoints, bufferSize, bufferInterval, a, X)
ASSIGNMENTXA point-wise operator performing X = scalar a.
Definition: Operators.f90:1222
int ComputeVelDiv(int threadId)
Definition: EulerRHS.H:1402
double * muPtr
Definition: EulerRHS.H:3981
simulation::rhs::domain_base< GridType, StateType, OperatorType > rhs_base_t
Definition: EulerRHS.H:67
int SetupRHS(GridType &inGrid, StateType &inState, StateType &rhsState, int myThreadId=0)
Definition: EulerRHS.H:272
std::vector< double * > & DVBuffers()
Definition: EulerRHS.H:3590
subroutine strongflux1d(numDim, fluxDir, gridSizes, numPoints, opInterval, gridType, gridMetric, tauBuffer, energyBuffer, fluxBuffer)
Compute the curvilinear cartesian viscous fluxes in 1 dimension.
Definition: Viscid.f90:126
double * rhoEPtr
Definition: EulerRHS.H:3972
int ComputeHeatFlux(int threadId)
Definition: EulerRHS.H:1625
int rhoHandle
Definition: EulerRHS.H:3853
double inputCFL
Definition: EulerRHS.H:3887
double refPr
Definition: EulerRHS.H:3906
int dScalarHandle
Definition: EulerRHS.H:3860
int ComputeDV(int threadId)
Definition: EulerRHS.H:1209
bool exchangeDV
Definition: EulerRHS.H:4097
double refEnergy
Definition: EulerRHS.H:3898
double pressureScale
Definition: EulerRHS.H:3910
size_t NNodes() const
Definition: IndexUtil.H:254
int transportModel
Definition: EulerRHS.H:3918
double * velGradBufferPtr
Definition: EulerRHS.H:4044
int DetectHoles(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int holeBit, int *inMask, int *stencilID)
Detect unstructured holes and set up boundary stencil id&#39;s accordingly.
Definition: Stencil.C:1454
eos::perfect_gas * perfectGasPtr
Definition: EulerRHS.H:4105
static const int HEATFLUX
Definition: EulerRHS.H:41
OperatorType artDissOperatorSplit
Definition: EulerRHS.H:4055
double * scalarRHSPtr
Definition: EulerRHS.H:3993
double * DFluxBuffer()
Definition: EulerRHS.H:3600
int * artDissConn
Definition: EulerRHS.H:4063
static const int USEWENO
Definition: EulerRHS.H:26
std::vector< double * > inviscidFluxBuffers
Definition: EulerRHS.H:4027
int ComputeScalarGradient(double *scalarData, double *gradData, int threadId=0, bool communicateData=false)
Definition: EulerRHS.H:1442
double temperatureScale
Definition: EulerRHS.H:3911
std::vector< double * > & StateBuffers()
Definition: EulerRHS.H:3594
void size_t int size_t int size_t int int int int double int * stencilOffsets
int ExchangeInviscidFlux(int threadId)
Definition: EulerRHS.H:1899
int timeSteppingMode
Definition: EulerRHS.H:3937
subroutine ijkgradtoxyzdiv(numDim, numPoints, gridSizes, opInterval, gridType, gridJacobian, gridMetric, gradVBuffer, divBuffer)
Definition: MetricOps.f90:129
int CreateMessageBuffers(int numComponents, int componentSize=8)
Definition: Grid.C:2850
subroutine farfield(numDim, bufferSizes, numPointsBuffer, patchNormalDir, patchSizes, numPointsPatch, numPatchPointsOp, patchPointsOp, gridType, gridMetric, jacobianDeterminant, bcParams, gasParams, rhoBuffer, rhoVBuffer, rhoEBuffer, viscousFluxBuffer, numscalar, scalarBuffer, rhoRHS, rhoVRHS, rhoERHS, scalarRHS, rhoTarget, rhoVTarget, rhoETarget, scalarTarget)
Definition: SATUtil.f90:16
int numEquations
Definition: EulerRHS.H:4085
int SetRHSState(StateType &rhsState)
Definition: EulerRHS.H:3073
pcpp::IndexIntervalType partitionBufferInterval
Definition: EulerRHS.H:3949
double refCv
Definition: EulerRHS.H:3904
double * InviscidFluxBuffer()
Definition: EulerRHS.H:3598
double refPressure
Definition: EulerRHS.H:3896
int gridType
Definition: EulerRHS.H:3955
double * viscidEnergy
Definition: EulerRHS.H:4007
int ApplyOperator(int dDir, int numComponents, double *uBuffer, double *duBuffer, int threadId, bool skipDensity=false)
Definition: EulerRHS.H:1014
std::vector< double > gridDX
Definition: EulerRHS.H:3952
Definition: Viscid.f90:1
void UnpackBufferMessage(int messageId, int numEquations, double *dataBuffer, int threadId)
Definition: EulerRHS.H:1809
int ComputeConcentrationGrad(int threadId)
Definition: EulerRHS.H:1509
int InitThreadIntervals()
Definition: EulerRHS.H:3281
int SetParamState(const StateType &paramState)
Definition: EulerRHS.H:1943
double * rhoTargetPtr
Definition: EulerRHS.H:3975
const double * rePtr
Definition: EulerRHS.H:3927
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double const double const double const double const double const double const int * numScalar
Definition: SATKernels.H:10
int numStateVar
Definition: EulerRHS.H:3934
static const int EXCHANGEFLUX
Definition: EulerRHS.H:23
int ExchangeDV(int threadId)
Definition: EulerRHS.H:1836
double inputSigmaDil
Definition: EulerRHS.H:3915
int Initialize(GridType &inGrid, StateType &inState, StateType &inParam, StateType &targetState, OperatorType &inOperator)
Definition: EulerRHS.H:180
int gradVHandle
Definition: EulerRHS.H:3877
OperatorType artDissOperator
Definition: EulerRHS.H:4054
const double * timePtr
Definition: EulerRHS.H:3922
subroutine flux1d(numDim, numPoints, gridSizes, opInterval, fluxDir, gridType, gridMetric, rhoBuffer, rhoVBuffer, rhoEBuffer, velHat, pressureBuffer, fluxBuffer)
Definition: Euler.f90:233
int Initialize(stencilset &stencilSet1, stencilset &stencilSet2, int interiorOrder)
Definition: Stencil.C:29
std::vector< double * > targetStateBuffers
Definition: EulerRHS.H:4031
const double * bulkViscFacPtr
Definition: EulerRHS.H:3921
int betaHandle
Definition: EulerRHS.H:3864
double * energyFluxPtr
Definition: EulerRHS.H:3998
double refMu
Definition: EulerRHS.H:3907
double * dvBuffer
Definition: EulerRHS.H:4037
double * cflPtr
Definition: EulerRHS.H:3987
int boundaryDepth
Definition: EulerRHS.H:4058
double * viscidFluxBuffer
Definition: EulerRHS.H:4040
std::vector< int > periodicDirs
Definition: EulerRHS.H:3960
double * pressurePtr
Definition: EulerRHS.H:3979
static const int AO
Definition: EulerRHS.H:42
int ComputeTVBufferPower(const pcpp::IndexIntervalType &regionInterval, const std::vector< size_t > &bufferSize, const double *temperatureBuffer, std::vector< double *> &tvBuffer, const double beta, const double power, const double bulkViscFac, const double specificHeat, const double prandtlNumber)
Compute transport coefficients using the power law.
Definition: ViscidUtil.C:14
const double * cpPtr
Definition: EulerRHS.H:3929
bool exchangeFlux
Definition: EulerRHS.H:4095
void Project(int n, int m, double T[], double vals[], double res[])
Definition: WENO.C:89
double refTemperature
Definition: EulerRHS.H:3895
static const int TV
Definition: EulerRHS.H:35
std::vector< double * > heatFluxBuffers
Definition: EulerRHS.H:4036
static const int CONCGRAD
Definition: EulerRHS.H:39
subroutine slip_adiabatic(numDim, bufferSizes, numPointsBuffer, patchNormalDir, patchSizes, numPointsPatch, numPatchPointsOp, patchPointsOp, gridType, gridMetric, jacobianDeterminant, bcParams, gasParams, rhoBuffer, rhoVBuffer, rhoEBuffer, numscalar, scalarBuffer, rhoRHS, rhoVRHS, rhoERHS, scalarRHS, rhoTarget, rhoVTarget, rhoETarget, scalarTarget)
Definition: SATUtil.f90:360
Main encapsulation of MPI.
Definition: COMM.H:62
std::vector< double * > & TVBuffers()
Definition: EulerRHS.H:3592
GASMODELS
Definition: EulerRHS.H:52
double myCFL
Definition: EulerRHS.H:3886
int ExchangeBuffer(int messageId, int numEquations, double *dataBuffer, int threadId)
Definition: EulerRHS.H:1865
void AccumulateToRHS(double a, double *dfBuffer, int threadId, bool skipDensity=false)
Definition: EulerRHS.H:1176
void LinearSponge(const std::vector< size_t > &bufferSizes, int normalDir, const pcpp::IndexIntervalType &spongeRegion, const pcpp::IndexIntervalType &partitionOpInterval, const pcpp::IndexIntervalType &opBufferInterval, const double *bcParams, const int *bcFlags, const int numEquations, const std::vector< double *> &stateBuffers, const std::vector< double *> &targetBuffers, std::vector< double *> &rhsBuffers)
base API for equations of state
Definition: EOS.H:17
int CreateStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int *stencilID, bool fortranInterval=false)
Creates simple stencil connectivity assuming all domain boundaries are physical boundaries.
Definition: Stencil.C:840
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double * a
sizeextent RelativeTranslation(const sizeextent &inOrigin, const sizeextent &inDestination) const
Definition: IndexUtil.H:535
std::vector< double * > viscidFluxBuffers
Definition: EulerRHS.H:4028
int velocityHandle
Definition: EulerRHS.H:3876
virtual int ProcessInterior2(GridType &inGrid, StateType &inState, StateType &rhsState)
Definition: EulerRHS.H:3581
int pressureHandle
Definition: EulerRHS.H:3869
#define CONSTANT_CFL
Definition: EulerRHS.H:32
double * scalarSourcePtr
Definition: EulerRHS.H:4016
std::vector< size_t > gridSizes
Definition: EulerRHS.H:3946
std::vector< double * > tvBuffers
Definition: EulerRHS.H:4026
bool useWENO
Definition: EulerRHS.H:4098
double * massFluxPtr
Definition: EulerRHS.H:3996
subroutine gradijktogradxyz(numDim, numPoints, gridSizes, opInterval, gridType, gridJacobian, gridMetric, gradIJK, gradXYZ)
Converts Cartesian (computational) gradient to physical coordinates.
Definition: MetricOps.f90:187
StateType * baseStatePtr
Definition: EulerRHS.H:3827
subroutine alphaweight(numDim, numPointsBuffer, bufferSizes, opInterval, gridType, gridMetric, alphaDir, alphaW)
Definition: MetricOps.f90:14
std::vector< BoundaryType > * domainBoundariesPtr
Definition: EulerRHS.H:4089
int internalEnergyHandle
Definition: EulerRHS.H:3875
const double * sigmaPtr
Definition: EulerRHS.H:3924
int ComputeViscidEnergyFlux(int threadId)
Definition: EulerRHS.H:1659
WENO::CoeffsWENO coeffsWENO
Definition: EulerRHS.H:4101
simulation::grid::halo HaloType
Definition: EulerRHS.H:66
eos::eos * eosPtr
Definition: EulerRHS.H:4104
void size_t int size_t int size_t int int int int double int int double double * duBuffer
void const size_t const size_t const size_t const int const double * gridJacobian
Definition: MetricKernels.H:9
size_t * dualStencilConn
Definition: EulerRHS.H:4068
double * energySourcePtr
Definition: EulerRHS.H:4015
int nonDimensionalMode
Definition: EulerRHS.H:3890
double beta
Definition: EulerRHS.H:3893
int ComputeVelGrad(int threadId)
Definition: EulerRHS.H:1481
int ApplyDissipationOperator(int dDir, int numComponents, double *uBuffer, double *duBuffer, bool split=false, int threadId=0)
Definition: EulerRHS.H:1064
int errorCode
Definition: EulerRHS.H:4077
fixtures::CommunicatorType * gridCommPtr
Definition: EulerRHS.H:3943
double * tempVector
Definition: EulerRHS.H:4049
int lambdaHandle
Definition: EulerRHS.H:3872
double TimeStep(double *outCFL=NULL)
Definition: EulerRHS.H:3647
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
size_t numPointsPartition
Definition: EulerRHS.H:3950
int dRhoVHandle
Definition: EulerRHS.H:3857
double * alphaDissipation
Definition: EulerRHS.H:4010
double refLength
Definition: EulerRHS.H:3902
double * scaledTau
Definition: EulerRHS.H:4043
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double double double * Y
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t * bufferInterval
const double * prPtr
Definition: EulerRHS.H:3928
std::vector< double * > myRHSBuffers
Definition: EulerRHS.H:4032
const double * cPtr
Definition: EulerRHS.H:3926
Perfect Gas Equation of State.
Definition: EOS.H:124
int HandleBoundaryConditions(int threadId)
Definition: EulerRHS.H:825
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double const double * gasParams
Definition: SATKernels.H:10
int rhom1Handle
Definition: EulerRHS.H:3874
subroutine zxy(numDim, numPoints, bufferSize, bufferInterval, X, Y, Z)
ZXY point-wise operator performing Z = XY (all vectors)
Definition: Operators.f90:679
void InitMinSpacing()
Definition: EulerRHS.H:3613
int reHandle
Definition: EulerRHS.H:3880
int * iMask
Definition: EulerRHS.H:4065
double * velocityPtr
Definition: EulerRHS.H:4003
double * momentumFluxPtr
Definition: EulerRHS.H:3997
double * rhoVTargetPtr
Definition: EulerRHS.H:3976
Definition: EulerRHS.H:33
bool artificialDissipation
Definition: EulerRHS.H:4096
void double double double double double double double *void const size_t const size_t const size_t const double * sigmaDissipation
Definition: SATKernels.H:48
virtual int ProcessHalo(HaloType &inHalo, GridType &inGrid, StateType &inState, StateType &rhsState)
Definition: EulerRHS.H:3583
void size_t int size_t int size_t int int int int double * stencilWeights
void size_t int size_t int size_t int * numStencils
int * stencilSizes
Definition: EulerRHS.H:4060
std::vector< double * > tauBuffers
Definition: EulerRHS.H:4035
std::vector< std::vector< double * > > haloFluxBuffers
Definition: EulerRHS.H:4020
void AccumulateViscousFluxes(double a, std::vector< double *> &X, std::vector< double *> &Y, int threadId, bool fullInterval=false)
Definition: EulerRHS.H:1760
int InviscidFlux(int iDim, int threadId)
Definition: EulerRHS.H:1303
int ComputeStressTensor(int threadId)
Definition: EulerRHS.H:1593
static const int DV
Definition: EulerRHS.H:34
std::vector< double > gridDXM1
Definition: EulerRHS.H:3953
void PackDVMessage(int threadId)
Definition: EulerRHS.H:1794
int temperatureHandle
Definition: EulerRHS.H:3870
int * stencilOffsets
Definition: EulerRHS.H:4061
int dvMessageId
Definition: EulerRHS.H:4080
std::vector< size_t > Sizes() const
Definition: IndexUtil.H:217
static const int BC
Definition: EulerRHS.H:47
void ExchangeBufferMessage(int messageId)
Definition: EulerRHS.H:1815
int ApplyWENO(int iDim, int threadId)
Definition: EulerRHS.H:533
int rhoEHandle
Definition: EulerRHS.H:3855
double gridJacobian
Definition: EulerRHS.H:3957
std::vector< double * > temperatureGradBuffers
Definition: EulerRHS.H:4034
subroutine yaxpy(N1, N2, N3, localInterval, a, X, Y)
Definition: RKUtil.f90:113
int HaloSetup(HaloType &inHalo)
Definition: EulerRHS.H:3420
int fluxMessageId
Definition: EulerRHS.H:4081
double * rhom1Ptr
Definition: EulerRHS.H:4004
int ArtificialDissipation(int threadId)
Definition: EulerRHS.H:712
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
double * scalarGrad
Definition: EulerRHS.H:4048
double * lambdaPtr
Definition: EulerRHS.H:3982
int SetHalo(HaloType &inHalo)
Definition: EulerRHS.H:3448
void size_t int * numComponents
std::vector< double * > & VelGradBuffers()
Definition: EulerRHS.H:3608
int maskMessageId
Definition: EulerRHS.H:4082
double velocityScale
Definition: EulerRHS.H:3912
int SetGrid(GridType &inGrid)
Definition: EulerRHS.H:3335
int gammaHandle
Definition: EulerRHS.H:3862
int NumberOfEquations()
Definition: EulerRHS.H:3602
static const int TGRAD
Definition: EulerRHS.H:38
int powerHandle
Definition: EulerRHS.H:3863
static const int TAU
Definition: EulerRHS.H:40
double * rhoERHSPtr
Definition: EulerRHS.H:3992
void SetDomainBCs(std::vector< BoundaryType > &domainBoundaries, std::vector< BCType > &domainBCs)
Definition: EulerRHS.H:3463
void SetMask(const std::vector< size_t > &opIndices, int maskBits, int *inMask)
Definition: Stencil.C:1847
rhs_base_t::GlobalType GlobalType
Definition: EulerRHS.H:70
subroutine sat_form_roe_matrices(ND, u_in, u_out, gamma, norm, tmat, tinv, lambda)
Definition: SATUtil.f90:1673
size_t * numPointsStencil
Definition: EulerRHS.H:4069
int muHandle
Definition: EulerRHS.H:3871
std::vector< bool > haveHalo
Definition: EulerRHS.H:4076
double power
Definition: EulerRHS.H:3892
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19
bool gridInitialized
Definition: EulerRHS.H:4073
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double * bcParams
Definition: SATKernels.H:10
void FC_MODULE(euler, flux1d, EULER, FLUX1D)(const int *numDim
std::vector< GridRegionType > * subRegionsPtr
Definition: EulerRHS.H:4088
std::vector< double * > & TemperatureGradBuffers()
Definition: EulerRHS.H:3610
int SetState(StateType &inState)
Definition: EulerRHS.H:3037
bool stateInitialized
Definition: EulerRHS.H:4072
void PackBufferMessage(int messageId, int numEquations, double *dataBuffer, int threadId)
Definition: EulerRHS.H:1803
int gradTHandle
Definition: EulerRHS.H:3878
double refSpecGasConst
Definition: EulerRHS.H:3909
std::vector< std::vector< double * > > haloStateBuffers
Definition: EulerRHS.H:4021
const double * inputDiffusivity
Definition: EulerRHS.H:3930
const double * sigmaDilPtr
Definition: EulerRHS.H:3925
double * massSourcePtr
Definition: EulerRHS.H:4013
double * tvBuffer
Definition: EulerRHS.H:4038