@@ -60,8 +60,14 @@ int main(int argc, char* argv[])
6060 if (ngrow > mf2.nGrow ()) {
6161 Abort (" ngrow bigger than infile2's ngrow! " );
6262 }
63- if (mf1.boxArray () != mf2.boxArray ()) {
64- Abort (" The two multifabs have different BoxArray" );
63+ bool same_boxarray = mf1.boxArray () == mf2.boxArray ();
64+ if (! same_boxarray) {
65+ if (ParallelDescriptor::IOProcessor ()) {
66+ Warning (" The two multifabs have different BoxArrays." );
67+ }
68+ AMREX_ALWAYS_ASSERT (mf1.boxArray ().ixType () == mf2.boxArray ().ixType () &&
69+ mf1.boxArray ().contains (mf2.boxArray ()) &&
70+ mf2.boxArray ().contains (mf1.boxArray ()));
6571 }
6672
6773 const int ncomp = mf1.nComp ();
@@ -78,16 +84,23 @@ int main(int argc, char* argv[])
7884 mf2_max[icomp] = mf2.max (icomp,ngrow);
7985 }
8086
81- MultiFab mfdiff (mf1.boxArray (), mf2.DistributionMap (), ncomp, ngrow);
87+ MultiFab mfdiff;
88+ if (same_boxarray) {
89+ mfdiff.define (mf1.boxArray (), mf2.DistributionMap (), ncomp, ngrow);
8290#ifdef AMREX_USE_MPI
83- {
84- MultiFab tmp (mf1.boxArray (), mf1.DistributionMap (), ncomp, ngrow);
85- MultiFab::Copy (tmp, mf1, 0 , 0 , ncomp, ngrow);
86- mfdiff.Redistribute (tmp, 0 , 0 , ncomp, IntVect (ngrow));
87- }
91+ {
92+ MultiFab tmp (mf1.boxArray (), mf1.DistributionMap (), ncomp, ngrow);
93+ MultiFab::Copy (tmp, mf1, 0 , 0 , ncomp, ngrow);
94+ mfdiff.Redistribute (tmp, 0 , 0 , ncomp, IntVect (ngrow));
95+ }
8896#else
89- MultiFab::Copy (mfdiff, mf1, 0 , 0 , ncomp, ngrow);
97+ MultiFab::Copy (mfdiff, mf1, 0 , 0 , ncomp, ngrow);
9098#endif
99+ } else {
100+ mfdiff.define (mf2.boxArray (), mf2.DistributionMap (), ncomp, ngrow);
101+ mfdiff.ParallelCopy (mf1, 0 , 0 , ncomp, ngrow, ngrow);
102+ }
103+
91104 MultiFab::Subtract (mfdiff, mf2, 0 , 0 , ncomp, ngrow);
92105
93106 for (int icomp = 0 ; icomp < ncomp; ++icomp) {
0 commit comments