Program Listing for File checkDivB.cpp
↰ Return to documentation for file (hydro/checkDivB.cpp
)
// ***********************************************************************************
// Idefix MHD astrophysical code
// Copyright(C) 2020-2022 Geoffroy R. J. Lesur <geoffroy.lesur@univ-grenoble-alpes.fr>
// and other code contributors
// Licensed under CeCILL 2.1 License, see COPYING for more information
// ***********************************************************************************
#include "hydro.hpp"
#include "dataBlock.hpp"
real Hydro::CheckDivB() {
real divB;
IdefixArray4D<real> Vs = this->Vs;
IdefixArray1D<real> dx1 = data->dx[IDIR];
IdefixArray1D<real> dx2 = data->dx[JDIR];
IdefixArray1D<real> dx3 = data->dx[KDIR];
IdefixArray3D<real> Ax1 = data->A[IDIR];
IdefixArray3D<real> Ax2 = data->A[JDIR];
IdefixArray3D<real> Ax3 = data->A[KDIR];
IdefixArray3D<real> dV = data->dV;
idefix_reduce("CheckDivB",
data->beg[KDIR], data->end[KDIR],
data->beg[JDIR], data->end[JDIR],
data->beg[IDIR], data->end[IDIR],
KOKKOS_LAMBDA (int k, int j, int i, real &divBmax) {
[[maybe_unused]] real dB1,dB2,dB3;
dB1=dB2=dB3=ZERO_F;
D_EXPAND( dB1=(Ax1(k,j,i+1)*Vs(BX1s,k,j,i+1)-Ax1(k,j,i)*Vs(BX1s,k,j,i)); ,
dB2=(Ax2(k,j+1,i)*Vs(BX2s,k,j+1,i)-Ax2(k,j,i)*Vs(BX2s,k,j,i)); ,
dB3=(Ax3(k+1,j,i)*Vs(BX3s,k+1,j,i)-Ax3(k,j,i)*Vs(BX3s,k,j,i)); )
divBmax=FMAX(FABS(D_EXPAND(dB1, +dB2, +dB3))/dV(k,j,i),divBmax);
},
Kokkos::Max<real>(divB) // reduction
);
#ifdef WITH_MPI
if(idfx::psize>1) {
MPI_Allreduce(MPI_IN_PLACE, &divB, 1, realMPI, MPI_MAX, MPI_COMM_WORLD);
}
#endif
return(divB);
}
/*
real Hydro::CheckDivB(DataBlock &data) {
real divB=0;
IdefixArray4D<real> Vs = this->Vs;
IdefixArray3D<real> Ax1 = data->A[IDIR];
IdefixArray3D<real> Ax2 = data->A[JDIR];
IdefixArray3D<real> Ax3 = data->A[KDIR];
IdefixArray3D<real> dV = data->dV;
int iref,jref,kref;
for(int k = data->beg[KDIR] ; k < data->end[KDIR] ; k++) {
for(int j = data->beg[JDIR] ; j < data->end[JDIR] ; j++) {
for(int i = data->beg[IDIR] ; i < data->end[IDIR] ; i++) {
real dB1,dB2,dB3;
dB1=dB2=dB3=ZERO_F;
D_EXPAND( dB1=(Ax1(k,j,i+1)*Vs(BX1s,k,j,i+1)-Ax1(k,j,i)*Vs(BX1s,k,j,i)); ,
dB2=(Ax2(k,j+1,i)*Vs(BX2s,k,j+1,i)-Ax2(k,j,i)*Vs(BX2s,k,j,i)); ,
dB3=(Ax3(k+1,j,i)*Vs(BX3s,k+1,j,i)-Ax3(k,j,i)*Vs(BX3s,k,j,i)); )
if(FABS(D_EXPAND(dB1, +dB2, +dB3))/dV(k,j,i) > divB) {
iref=i;
jref=j;
kref=k;
divB=FABS(D_EXPAND(dB1, +dB2, +dB3))/dV(k,j,i);
}
}
}
}
idfx::cout << "divB=" << divB << "(i,j,k)=(" << iref << "," << jref << "," << kref
<< ")" << std::endl;
idfx::cout << "dV=" << dV(kref,jref,iref) << std::endl;
idfx::cout << " Ax1=" <<Ax1(kref,jref,iref) << " ; " << Ax1(kref,jref,iref+1) << std::endl;
idfx::cout << " Ax2=" <<Ax2(kref,jref,iref) << " ; " << Ax2(kref,jref+1,iref) << std::endl;
idfx::cout << " Bx1=" <<Vs(BX1s,kref,jref,iref) << " ; " << Vs(BX1s,kref,jref,iref+1)
<< std::endl;
idfx::cout << " Bx2=" <<Vs(BX2s,kref,jref,iref) << " ; " << Vs(BX2s,kref,jref+1,iref)
<< std::endl;
return(divB);
}
*/