Skip to content

Commit ec0594d

Browse files
authored
Reduce roundoff error on div(B) when using grid coarsening (#284)
* reduce roundoff error when using coarsening * update reference tag for new grid coarsening
1 parent d9466ab commit ec0594d

2 files changed

Lines changed: 34 additions & 10 deletions

File tree

src/fluid/coarsenFlow.hpp

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -290,28 +290,52 @@ void Fluid<Phys>::CoarsenMagField(IdefixArray4D<real> &Vsin) {
290290
// We reconstruct the parrallel field component with divB=0
291291

292292
int factor = 1 << (coarsening-1);
293+
294+
293295
if( (index-begDir)%factor == 0) {
296+
real qt = 0;
297+
real qb = 0;
298+
299+
// Loop forward
294300
for(int shift = 0 ; shift < factor-1 ; shift++) {
295-
real qt = Vsin(BXt,k+kt+shift*koffset, j+jt+shift*joffset, i+it+shift*ioffset)
301+
qt += Vsin(BXt,k+kt+shift*koffset, j+jt+shift*joffset, i+it+shift*ioffset)
296302
* At(k+kt+shift*koffset, j+jt+shift*joffset, i+it+shift*ioffset)
297303
- Vsin(BXt,k+shift*koffset, j+shift*joffset, i+shift*ioffset)
298304
* At(k+shift*koffset, j+shift*joffset, i+shift*ioffset);
299305
#if DIMENSIONS == 3
300-
real qb = Vsin(BXb,k+kb+shift*koffset, j+jb+shift*joffset, i+ib+shift*ioffset)
306+
qb += Vsin(BXb,k+kb+shift*koffset, j+jb+shift*joffset, i+ib+shift*ioffset)
301307
* Ab(k+kb+shift*koffset, j+jb+shift*joffset, i+ib+shift*ioffset)
302308
- Vsin(BXb,k+shift*koffset, j+shift*joffset, i+shift*ioffset)
303309
* Ab(k+shift*koffset, j+shift*joffset, i+shift*ioffset);
304-
#else
305-
real qb = 0.0;
306310
#endif
307311

308312
Vsin(BXn, k+(shift+1)*koffset, j+(shift+1)*joffset, i+(shift+1)*ioffset) =
313+
((real) (factor-(shift+1))) / ((real)factor) *
309314
1.0/An(k+(shift+1)*koffset, j+(shift+1)*joffset, i+(shift+1)*ioffset) *
310-
(
311-
Vsin(BXn, k+shift*koffset, j+shift*joffset, i+shift*ioffset) *
312-
An(k+shift*koffset, j+shift*joffset, i+shift*ioffset)
313-
- qt - qb
314-
);
315+
(Vsin(BXn, k, j, i) * An(k, j, i) - qt - qb);
316+
}
317+
// Loop backward
318+
qt = 0;
319+
qb = 0;
320+
321+
// Loop forward
322+
for(int shift = factor-1 ; shift >=1 ; shift--) {
323+
qt += Vsin(BXt,k+kt+shift*koffset, j+jt+shift*joffset, i+it+shift*ioffset)
324+
* At(k+kt+shift*koffset, j+jt+shift*joffset, i+it+shift*ioffset)
325+
- Vsin(BXt,k+shift*koffset, j+shift*joffset, i+shift*ioffset)
326+
* At(k+shift*koffset, j+shift*joffset, i+shift*ioffset);
327+
#if DIMENSIONS == 3
328+
qb += Vsin(BXb,k+kb+shift*koffset, j+jb+shift*joffset, i+ib+shift*ioffset)
329+
* Ab(k+kb+shift*koffset, j+jb+shift*joffset, i+ib+shift*ioffset)
330+
- Vsin(BXb,k+shift*koffset, j+shift*joffset, i+shift*ioffset)
331+
* Ab(k+shift*koffset, j+shift*joffset, i+shift*ioffset);
332+
#endif
333+
334+
Vsin(BXn, k+shift*koffset, j+shift*joffset, i+shift*ioffset) +=
335+
((real) shift) / ((real)factor) *
336+
1.0/An(k+shift*koffset, j+shift*joffset, i+shift*ioffset) *
337+
(Vsin(BXn, k+factor*koffset, j+factor*joffset, i+factor*ioffset)
338+
* An( k+factor*koffset, j+factor*joffset, i+factor*ioffset) + qt + qb);
315339
}
316340
}
317341
}

0 commit comments

Comments
 (0)