20 #undef _MINIMUM_GHOSTS_ 25 #define _MINIMUM_GHOSTS_ 3 99 int ghosts = solver->
ghosts;
100 int ndims = solver->
ndims;
101 int nvars = solver->
nvars;
105 static const double one_half = 1.0/2.0;
106 static const double one_third = 1.0/3.0;
107 static const double one_sixth = 1.0/6.0;
109 double *ww1, *ww2, *ww3;
110 ww1 = weno->w1 + (upw < 0 ? 2*weno->size : 0) + (uflag ? weno->size : 0) + weno->offset[dir];
111 ww2 = weno->w2 + (upw < 0 ? 2*weno->size : 0) + (uflag ? weno->size : 0) + weno->offset[dir];
112 ww3 = weno->w3 + (upw < 0 ? 2*weno->size : 0) + (uflag ? weno->size : 0) + weno->offset[dir];
116 int indexC[ndims], indexI[ndims], index_outer[ndims], bounds_outer[ndims], bounds_inter[ndims];
117 _ArrayCopy1D_(dim,bounds_outer,ndims); bounds_outer[dir] = 1;
118 _ArrayCopy1D_(dim,bounds_inter,ndims); bounds_inter[dir] += 1;
124 double R[nvars*nvars], L[nvars*nvars], uavg[nvars];
127 double *A = compact->
A;
128 double *B = compact->
B;
129 double *C = compact->
C;
130 double *F = compact->
R;
132 #pragma omp parallel for schedule(auto) default(shared) private(sys,d,v,k,R,L,uavg,index_outer,indexC,indexI) 133 for (sys=0; sys<Nsys; sys++) {
137 for (indexI[dir] = 0; indexI[dir] < dim[dir]+1; indexI[dir]++) {
138 int qm1,qm2,qm3,qp1,qp2;
140 indexC[dir] = indexI[dir]-3;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qm3);
141 indexC[dir] = indexI[dir]-2;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qm2);
142 indexC[dir] = indexI[dir]-1;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qm1);
143 indexC[dir] = indexI[dir] ;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qp1);
144 indexC[dir] = indexI[dir]+1;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qp2);
146 indexC[dir] = indexI[dir]+2;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qm3);
147 indexC[dir] = indexI[dir]+1;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qm2);
148 indexC[dir] = indexI[dir] ;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qm1);
149 indexC[dir] = indexI[dir]-1;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qp1);
150 indexC[dir] = indexI[dir]-2;
_ArrayIndex1D_(ndims,dim,indexC,ghosts,qp2);
163 for (v=0; v<nvars; v++) {
166 double fm3, fm2, fm1, fp1, fp2;
167 fm3 = fm2 = fm1 = fp1 = fp2 = 0;
168 for (k = 0; k < nvars; k++) {
169 fm3 += L[v*nvars+k] * fC[qm3*nvars+k];
170 fm2 += L[v*nvars+k] * fC[qm2*nvars+k];
171 fm1 += L[v*nvars+k] * fC[qm1*nvars+k];
172 fp1 += L[v*nvars+k] * fC[qp1*nvars+k];
173 fp2 += L[v*nvars+k] * fC[qp2*nvars+k];
178 if ( ((mpi->
ip[dir] == 0 ) && (indexI[dir] == 0 ))
179 || ((mpi->
ip[dir] == mpi->
iproc[dir]-1) && (indexI[dir] == dim[dir])) ) {
181 f1 = (2*one_sixth)*fm3 - (7.0*one_sixth)*fm2 + (11.0*one_sixth)*fm1;
182 f2 = (-one_sixth)*fm2 + (5.0*one_sixth)*fm1 + (2*one_sixth)*fp1;
183 f3 = (2*one_sixth)*fm1 + (5*one_sixth)*fp1 - (one_sixth)*fp2;
186 f1 = (one_sixth) * (fm2 + 5*fm1);
187 f2 = (one_sixth) * (5*fm1 + fp1);
188 f3 = (one_sixth) * (fm1 + 5*fp1);
193 w1 = *(ww1+p*nvars+v);
194 w2 = *(ww2+p*nvars+v);
195 w3 = *(ww3+p*nvars+v);
199 if ( ((mpi->
ip[dir] == 0 ) && (indexI[dir] == 0 ))
200 || ((mpi->
ip[dir] == mpi->
iproc[dir]-1) && (indexI[dir] == dim[dir])) ) {
204 double cuckoo, df_jm12, df_jp12, df_jp32, r_j, r_jp1, r_int;
205 cuckoo = (0.9*weno->rc / (1.0-0.9*weno->rc)) * weno->xi * weno->xi;
209 r_j = (
absolute(2*df_jp12*df_jm12)+cuckoo)/(df_jp12*df_jp12+df_jm12*df_jm12+cuckoo);
210 r_jp1 = (
absolute(2*df_jp32*df_jp12)+cuckoo)/(df_jp32*df_jp32+df_jp12*df_jp12+cuckoo);
211 r_int =
min(r_j, r_jp1);
212 sigma =
min((r_int/weno->rc), 1.0);
216 for (k=0; k<nvars; k++) {
217 A[(Nsys*indexI[dir]+sys)*nvars*nvars+v*nvars+k] = (one_half*sigma) * L[v*nvars+k];
218 B[(Nsys*indexI[dir]+sys)*nvars*nvars+v*nvars+k] = (1.0) * L[v*nvars+k];
219 C[(Nsys*indexI[dir]+sys)*nvars*nvars+v*nvars+k] = (one_sixth*sigma) * L[v*nvars+k];
222 for (k=0; k<nvars; k++) {
223 C[(Nsys*indexI[dir]+sys)*nvars*nvars+v*nvars+k] = (one_half*sigma) * L[v*nvars+k];
224 B[(Nsys*indexI[dir]+sys)*nvars*nvars+v*nvars+k] = (1.0) * L[v*nvars+k];
225 A[(Nsys*indexI[dir]+sys)*nvars*nvars+v*nvars+k] = (one_sixth*sigma) * L[v*nvars+k];
228 double fWENO, fCompact;
229 fWENO = w1*f1 + w2*f2 + w3*f3;
230 fCompact = one_sixth * (one_third*fm2 + 19.0*one_third*fm1 + 10.0*one_third*fp1);
231 F[(Nsys*indexI[dir]+sys)*nvars+v] = sigma*fCompact + (1.0-sigma)*fWENO;
245 if (mpi->
ip[dir] != mpi->
iproc[dir]-1) {
252 double *sendbuf = compact->
sendbuf;
253 double *recvbuf = compact->
recvbuf;
254 MPI_Request req[2] = {MPI_REQUEST_NULL,MPI_REQUEST_NULL};
255 if (mpi->
ip[dir])
for (d=0; d<Nsys*nvars; d++) sendbuf[d] = F[d];
256 if (mpi->
ip[dir] != mpi->
iproc[dir]-1) MPI_Irecv(recvbuf,Nsys*nvars,MPI_DOUBLE,mpi->
ip[dir]+1,214,mpi->
comm[dir],&req[0]);
257 if (mpi->
ip[dir]) MPI_Isend(sendbuf,Nsys*nvars,MPI_DOUBLE,mpi->
ip[dir]-1,214,mpi->
comm[dir],&req[1]);
258 MPI_Status status_arr[2];
259 MPI_Waitall(2,&req[0],status_arr);
260 if (mpi->
ip[dir] != mpi->
iproc[dir]-1)
for (d=0; d<Nsys*nvars; d++) F[d+Nsys*nvars*dim[dir]] = recvbuf[d];
265 #pragma omp parallel for schedule(auto) default(shared) private(sys,d,v,k,R,L,uavg,index_outer,indexC,indexI) 266 for (sys=0; sys<Nsys; sys++) {
269 for (indexI[dir] = 0; indexI[dir] < dim[dir]+1; indexI[dir]++) {
271 _ArrayCopy1D_((F+sys*nvars+Nsys*nvars*indexI[dir]),(fI+nvars*p),nvars);
MPI related function definitions.
Contains function definitions for common mathematical functions.
Header file for TridiagLU.
int(* AveragingFunction)(double *, double *, double *, void *)
Some basic definitions and macros.
#define _ArrayIndexnD_(N, index, imax, i, ghost)
int blocktridiagLU(double *, double *, double *, double *, int, int, int, void *, void *)
Structure containing all solver-specific variables and functions.
int Interp1PrimFifthOrderHCWENOChar(double *fI, double *fC, double *u, double *x, int upw, int dir, void *s, void *m, int uflag)
5th order hybrid compact-WENO reconstruction (characteristic-based) on a uniform grid ...
Contains structure definition for hypar.
#define _ArrayIndex1D_(N, imax, i, ghost, index)
Structure of variables/parameters needed by the WENO-type scheme.
Structure of variables/parameters needed by the compact schemes.
Contains macros and function definitions for common matrix multiplication.
Structure of MPI-related variables.
Definitions for the functions computing the interpolated value of the primitive at the cell interface...
#define _ArrayCopy1D_(x, y, size)
Contains macros and function definitions for common array operations.
int(* GetRightEigenvectors)(double *, double *, void *, int)
#define _ArrayProduct1D_(x, size, p)
int(* GetLeftEigenvectors)(double *, double *, void *, int)