void AMR_Create(int MPI_communicator,
int components,
int dimension,
int centering,
int datatype,
int ordering,
int* levelhandle);
void AMR_addPatchFloat( int levelhandle,
int* loRange, int* hiRange,
int* loValid, int* hiValid,
float* dataPtr);
void AMR_Close(int levelhandle);
void AMR_Delete(int levelhandle);
void AMR_GetInfo(int levelhandle,
int* MPI_communicator,
int* nComponents,
int* dimension,
int* centering,
int* datatype,
int* ordering,
int* localcount);
void AMR_GetPatchInfo( int levelhandle,
int** loRange, int** hiRange,
int** loValid, int** hiValid);
void AMR_GetPatchFloat( int levelhandle, float** dataPtr);
void AMR_NextPatchInfo( int levelhandle,
int** loRange, int** hiRange,
int** loValid, int** hiValid);
void AMR_NextPatchFloat( int levelhandle, float** dataPtr);
extern "C" {
int helm3_( double dx, double helmsoeff, double scale,
double tolerance, int maxIter, int minIter,
int* domain_lo, int* domain_hi, int phi, int rhs )
{
int p_comps, p_dimension,p_centering,p_type,p_ordering,p_count;
AMR_GetInfo(phi,&p_comps, &p_dimension,&p_centering,
&p_type,&p_ordering,&p_count);
//---perform checks on input data here.... return codes, etc. omitted---
AliasDataFactory phiFactory(phi);
AliasDataFactory rhsFactory(rhs);
levelData<FArrayBox> p(phiFactory);
levelData<FArrayBox> r(rhsFactory);
ProblemDomain pd(Box(domain_lo, domain_hi));
HelmHoltzOp hop;
LevelSolver solver;
hop.setHelmCoeff(helmcoeff);
hop.scaleHelmCoeff(scale);
solver.setTolerace(tolerance);
solver.setMaxIter(maxIter);
solver.define(p.getBoxes(), NULL, pd, dx, 1, &hop, p_comps);
solver.levelSolveH(p, r);
return 0;
}
}
void ChomboHelmHoltz3(XArray3<Grid3<double> >& phi,
XArray3<Grid3<double> >& rhs,
double dx, double helmcoeff, double scale,
double tolerance, int maxIter, int minIter,
const Region& domain)
{
int p, r, i;
AMR_Create( 1, 3, 1, 3, 0, &p);
AMR_Create( 1, 3, 1, 3, 0, &r);
for (nodeIterator ni(phi); ni; ++ni)
{
i = ni();
double *p_ptr(phi.ptr(i)), *r_ptr(rhs.ptr(i));
Region reg = phi.floorplan(i);
Region valid(reg);
valid.grow(-1);
AMR_addPatchDouble(p, reg.lower()(), reg.upper()()
valid.lower()(), valid.upper()(), p_ptr);
AMR_addPatchDouble(r, reg.lower()(), reg.upper()()
valid.lower()(), valid.upper()(), r_ptr);
}
AMR_close(p);
AMR_close(r);
helm3_(dx, helmcoeff,scale, tolerance, maxIter,
minIter,domain.lower()(), domain.upper()(), p, r);
AMR_Delete(p);
AMR_Delete(r);
}
subroutine CHhelm3(dx, helmcoeff, scale, tolerance, maxIter, minIter)
integer maxIter, minIter, phi_handle, rhs_handle, offset, lo(3), hi(3)
real*8 dx(3), helmcoeff, scale, tolerance)
DBASEMODULE()
call amrcreate( 1, 3, 1, 3, 0, phi_handle)
call amrcreate( 1, 3, 1, 3, 0, rhs_handle)
do this_block = 1, level_blocks
call dBaseGetIntCoords( "phi", this_block, lo, hi)
call dBaseGetDataOffset("phi", this_block, offset)
call amraddpatchdouble(phi_handle, lo, hi, lo, hi, DATA(offset))
call dBaseGetDataOffset("rhs", this_block, offset)
call amraddpatchdouble(rhs_handle, lo, hi, lo, hi, DATA(offset))
end do
call amrclose(phi_handle)
call amrclose(rhs_handle)
call helm3(dx, helmcoeff,scale, tolerance, maxIter,
& minIter,dl, dh , phi_handle, rhs_handle)
return
end
MPI_Comm_c2f and MPI_Comm_f2c to create language independent fundamental types for MPI Communicators.
AMR_OpenHDF5(char *filename, int MPI_Communicator, int mode, int *hdf5)
AMR_WriteData(int hdf5, int numLevels, int *levelData, int ncomp,
char **compNames, int *refineFactor,
double *spacing, double time, double dt,
CONST int *domain_lo, CONST int *domain_hi)
AMR_ReadMetaData(int hdf5, int *numLevels, int *ncomp,
int *ndim, double *spacingCoarse,
int *domain_lo_valid, int * domain_hi_valid,
double *time, double* dtCoarse)
AMR_ReadLevel(int hdf5, int level, int levelDatahandle,
int compBegin, int ncomp)