12 #ifndef _PYTHONINTERFACE_H_ 13 #define _PYTHONINTERFACE_H_ 25 #include "NamespaceHeader.H" 50 const std::string& a_pyModuleName);
54 const std::string& a_pyFuncName );
60 void FillKwargs(std::map<std::string,Real>& a_kwarg,
62 const DataIterator& a_dit,
const IntVect& a_iv);
64 void PythonEval(PyObject* a_pyFunc, Vector<Real>& a_value, Vector<Real>& a_arg, std::map<std::string, Real>* a_kwarg = NULL);
73 PyObject* m_pFuncThck;
74 PyObject* m_pFuncTopg;
76 PyObject* m_pFuncFaceVel;
78 enum BCType {IceDivide, NoSlip, Natural, MaxBCType};
80 RefCountedPtr<CompGridVTOBC> BCFactory(BCType a_type,
82 Side::LoHiSide a_side)
84 if (a_type == IceDivide)
88 else if (a_type == NoSlip)
92 else if (a_type == Natural)
96 CH_assert(a_type < MaxBCType && a_type > 0);
102 PythonIBC(
const std::string& a_pyModuleName ,
103 const std::string& a_pyFuncThckName,
104 const std::string& a_pyFuncTopgName,
105 const std::string& a_pyFuncRhsName,
106 const std::string& a_pyFuncFaceVelName);
117 virtual void define(
const ProblemDomain& a_domain,
132 virtual void initialize(LevelData<FArrayBox>& a_U);
135 const RealVect& a_dx,
136 const RealVect& a_domainSize,
139 const int a_refRatio);
145 const RealVect& a_dx,
146 const RealVect& a_domainSize,
149 const int a_refRatio);
156 const ProblemDomain& a_domain,
157 Real a_time, Real a_dt);
163 const ProblemDomain& a_domain)
const ;
168 virtual void primBC(FArrayBox& a_WGdnv,
169 const FArrayBox& a_Wextrap,
170 const FArrayBox& a_W,
172 const Side::LoHiSide& a_side,
183 const FArrayBox& a_W,
192 const FArrayBox& a_U,
193 const FArrayBox& a_divVel,
208 const ProblemDomain& a_domain,
209 const RealVect& a_dx,
210 Real a_time, Real a_dt);
213 const ProblemDomain& a_domain,
214 const RealVect& a_dx,
215 Real a_time, Real a_dt);
218 const ProblemDomain& a_domain,
219 const RealVect& a_dx,
220 Real a_time, Real a_dt);
226 RefCountedPtr<CompGridVTOBC> m_velBC;
235 MayDay::Error(
"invalid operator");
241 MayDay::Error(
"invalid operator");
244 PythonIBC(PyObject* a_pModule, PyObject* a_pFuncThck,
245 PyObject* a_pFuncTopg, PyObject* a_pFuncRhs,
246 PyObject* a_pFuncFaceVel)
249 m_pModule = a_pModule;
250 m_pFuncThck = a_pFuncThck;
251 m_pFuncTopg = a_pFuncTopg;
252 m_pFuncRhs = a_pFuncRhs;
253 m_pFuncFaceVel = a_pFuncFaceVel;
254 Py_XINCREF(m_pModule);
255 Py_XINCREF(m_pFuncThck);
256 Py_XINCREF(m_pFuncTopg);
257 if (m_pFuncRhs != NULL)
259 Py_XINCREF(m_pFuncRhs);
261 if (m_pFuncFaceVel != NULL)
263 Py_XINCREF(m_pFuncFaceVel);
296 std::map<std::string,Real> m_kwarg;
306 const std::string& a_pyFunc,
307 std::map<std::string,Real>& a_kwarg);
313 virtual void surfaceThicknessFlux(LevelData<FArrayBox>& a_flux,
315 int a_level, Real a_dt);
322 MayDay::Error(
"invalid operator");
328 MayDay::Error(
"invalid operator");
333 MayDay::Error(
"invalid operator");
336 PythonSurfaceFlux(PyObject* a_pModule, PyObject* a_pFunc, std::map<std::string,Real>& a_kwarg)
338 m_pModule = a_pModule;
340 Py_XINCREF(m_pModule);
356 const std::string& a_pyFuncName) ;
361 virtual void basalHeatFlux(LevelData<FArrayBox>& a_flux,
363 int a_level, Real a_dt);
365 #if BISICLES_Z == BISICLES_LAYERED 366 virtual void initializeIceInternalEnergy(LevelData<FArrayBox>& a_E,
367 LevelData<FArrayBox>& a_tillWaterDepth,
368 LevelData<FArrayBox>& a_surfaceE,
369 LevelData<FArrayBox>& a_basalE,
371 int a_level, Real a_dt);
373 virtual void setIceInternalEnergyBC(LevelData<FArrayBox>& a_E,
374 LevelData<FArrayBox>& a_tillWaterDepth,
375 LevelData<FArrayBox>& a_surfaceE,
376 LevelData<FArrayBox>& a_basalE,
379 #elif BISICLES_Z == BISICLES_FULLZ 380 #error BISICLES_FULLZ not implemented 390 m_pModule = a_pModule;
392 Py_XINCREF(m_pModule);
430 const std::string& a_pyFunc);
436 virtual void setBasalFriction(LevelData<FArrayBox>& a_C,
443 MayDay::Error(
"invalid operator");
448 MayDay::Error(
"invalid operator");
463 m_pModule = a_pModule;
465 Py_XINCREF(m_pModule);
480 const std::string& a_pyFunc);
486 virtual void setMuCoefficient(LevelData<FArrayBox>& a_C,
493 MayDay::Error(
"invalid operator");
498 MayDay::Error(
"invalid operator");
509 m_pModule = a_pModule;
511 Py_XINCREF(m_pModule);
525 virtual void define(
const ProblemDomain& a_coarseDomain,
528 const Vector<DisjointBoxLayout>& a_vectGrids,
529 const Vector<int>& a_vectRefRatio,
530 const RealVect& a_dxCrse,
535 virtual int solve(Vector<LevelData<FArrayBox>* >& a_horizontalVel,
536 Vector<LevelData<FArrayBox>* >& a_calvedIce,
537 Vector<LevelData<FArrayBox>* >& a_addedIce,
538 Vector<LevelData<FArrayBox>* >& a_removedIce,
539 Real& a_initialResidualNorm, Real& a_finalResidualNorm,
540 const Real a_convergenceMetric,
541 const Vector<LevelData<FArrayBox>* >& a_rhs,
542 const Vector<LevelData<FArrayBox>* >& a_beta,
543 const Vector<LevelData<FArrayBox>* >& a_beta0,
544 const Vector<LevelData<FArrayBox>* >& a_A,
545 const Vector<LevelData<FArrayBox>* >& a_muCoef,
546 Vector<RefCountedPtr<LevelSigmaCS > >& a_coordSys,
548 int a_lbase,
int a_maxLevel);
553 m_pModule = a_pModule;
555 Py_XINCREF(m_pModule);
565 MayDay::Error(
"invalid operator");
570 MayDay::Error(
"invalid operator");
576 #include "NamespaceFooter.H" PythonIBC()
Definition: PythonInterface.cpp:213
Apply natural conditions along one boundary.
Definition: VelocityBC.H:141
BasalFriction that calls a python function to compute .
Definition: PythonInterface.H:416
Definition: MuCoefficient.H:25
Apply ice divide conditions along one boundary.
Definition: VelocityBC.H:83
Abstract class to manage the nonlinear solve for the ice-sheet momentum.
Definition: IceVelocitySolver.H:32
Abstract class around the englacial constitutive relations for ice.
Definition: ConstitutiveRelation.H:34
virtual RefCountedPtr< CompGridVTOBC > velocitySolveBC()
return boundary condition for Ice velocity solve
Definition: PythonInterface.cpp:310
PythonVelocitySolver(PyObject *a_pModule, PyObject *a_pFunc)
Definition: PythonInterface.H:551
virtual void modifyFaceVelocity(LevelData< FluxBox > &a_faceVel, const LevelSigmaCS &a_coords, const ProblemDomain &a_domain) const
if appropriate, modify face velocities in a problem-dependent way.
Definition: PythonInterface.cpp:530
virtual void setGeometryBCs(LevelSigmaCS &a_coords, const ProblemDomain &a_domain, const RealVect &a_dx, Real a_time, Real a_dt)
set non-periodic geometry (thickness, topography) ghost cells
Definition: PythonInterface.cpp:427
virtual void artViscBC(FArrayBox &a_F, const FArrayBox &a_U, const FArrayBox &a_divVel, const int &a_dir, const Real &a_time)
Adjust boundary fluxes to account for artificial viscosity.
Definition: PythonInterface.cpp:297
Apply no-slip conditions along one boundary.
Definition: VelocityBC.H:27
Physical/domain initial and boundary conditions for ice-sheet problems.
Definition: IceThicknessIBC.H:84
PythonVelocitySolver()
Definition: PythonInterface.H:558
virtual void modifyVelocityRHS(LevelData< FArrayBox > &a_rhs, LevelSigmaCS &a_coords, const ProblemDomain &a_domain, Real a_time, Real a_dt)
if appropriate, modify velocity solve RHS in a problem-dependent way.
Definition: PythonInterface.cpp:586
virtual void primBC(FArrayBox &a_WGdnv, const FArrayBox &a_Wextrap, const FArrayBox &a_W, const int &a_dir, const Side::LoHiSide &a_side, const Real &a_time)
Set boundary fluxes.
Definition: PythonInterface.cpp:250
virtual void initializeIceGeometry(LevelSigmaCS &a_coords, const RealVect &a_dx, const RealVect &a_domainSize, const Real &a_time, const LevelSigmaCS *a_crseCoords, const int a_refRatio)
set up initial ice state
Definition: PythonInterface.cpp:445
virtual ~PythonIBC()
Definition: PythonInterface.cpp:219
PhysIBC-derived class that allows the internalEnergy to set a a user-defined python function f(x...
Definition: PythonInterface.H:351
Common virtual base class for internal energy transport IBC.
Definition: IceInternalEnergyIBC.H:29
virtual void setIceFractionBCs(LevelData< FArrayBox > &a_fraction, const ProblemDomain &a_domain, const RealVect &a_dx, Real a_time, Real a_dt)
set non-periodic ghost cells for ice fraction
Definition: PythonInterface.cpp:410
virtual void setSurfaceHeightBCs(LevelData< FArrayBox > &a_zSurface, LevelSigmaCS &a_coords, const ProblemDomain &a_domain, const RealVect &a_dx, Real a_time, Real a_dt)
set non-periodic ghost cells for surface height z_s.
Definition: PythonInterface.cpp:391
abstract class defining the surface flux interface
Definition: SurfaceFlux.H:39
PythonInterface::PythonIBC, a PhysIBC-derived class which allows the bedrock and topography to be set...
Definition: PythonInterface.H:70
Definition: PythonInterface.H:472
Basic Sigma fourth-order coordinate system on an AMR level.
Definition: LevelSigmaCS.H:48
void PythonEval(PyObject *a_pyFunc, Vector< Real > &a_value, Vector< Real > &a_arg, std::map< std::string, Real > *a_kwarg=NULL)
Definition: PythonInterface.cpp:28
void FillKwargs(std::map< std::string, Real > &a_kwarg, const AmrIceBase &a_amrIce, int a_level, const DataIterator &a_dit, const IntVect &a_iv)
Definition: PythonInterface.cpp:678
bool regridIceGeometry(LevelSigmaCS &a_coords, const RealVect &a_dx, const RealVect &a_domainSize, const Real &a_time, const LevelSigmaCS *a_crseCoords, const int a_refRatio)
set up topography, etc at regrid time
Definition: PythonInterface.cpp:491
virtual void define(const ProblemDomain &a_domain, const Real &a_dx)
Define the object.
Definition: PythonInterface.cpp:236
Virtual base class for basal friction relations.
Definition: BasalFrictionRelation.H:27
Definition: PythonInterface.H:47
Definition: PythonInterface.H:517
void InitializePythonFunction(PyObject **a_pFunc, PyObject *a_pModule, const std::string &a_pyFuncName)
Definition: PythonInterface.cpp:144
void InitializePythonModule(PyObject **a_pModule, const std::string &a_pyModuleName)
Definition: PythonInterface.cpp:118
Definition: BasalFriction.H:28
abstract base class for amr ice sheet models (AmrIce, AMRIceControl)
Definition: AmrIceBase.H:21
Use a python function to evaluate the surface flux.
Definition: PythonInterface.H:292
virtual void initialize(LevelData< FArrayBox > &a_U)
Set up initial conditions.
Definition: PythonInterface.cpp:243
virtual void setBdrySlopes(FArrayBox &a_dW, const FArrayBox &a_W, const int &a_dir, const Real &a_time)
Set boundary slopes.
Definition: PythonInterface.cpp:288
virtual IceThicknessIBC * new_thicknessIBC()
Factory method - this object is its own factory.
Definition: PythonInterface.cpp:645