73 CH_TIME(
"ItoKMCFieldTagger::computeElectricField");
74 if (this->m_verbosity > 5) {
75 pout() << this->m_name +
"::computeElectricField" << endl;
78 CH_assert(this->m_isDefined);
79 CH_assert(a_E[0]->nComp() == SpaceDim);
80 CH_assert(a_gradE[0]->nComp() == SpaceDim);
82 this->m_timeStepper->computeElectricField(a_E, this->m_phase);
85 this->m_amr->getNotCoveredCells(this->m_realm, this->m_phase),
86 this->m_amr->getMultiCutVofIterator(this->m_realm, this->m_phase));
87 this->m_amr->computeGradient(a_gradE, m_scratch, this->m_realm, this->m_phase);
89 this->m_amr->conservativeAverage(a_gradE, this->m_realm, this->m_phase);
90 this->m_amr->interpGhost(a_gradE, this->m_realm, this->m_phase);
93 this->m_amr->interpToCentroids(a_E, this->m_realm, this->m_phase);
94 this->m_amr->interpToCentroids(a_gradE, this->m_realm, this->m_phase);
101 CH_TIME(
"ItoKMCFieldTagger::computeTagFields");
102 if (this->m_verbosity > 5) {
103 pout() << this->m_name +
"::computeTagFields" << endl;
106 CH_assert(this->m_isDefined);
108 this->allocateStorage();
109 this->computeElectricField(m_E, m_gradE);
111 const RealVect probLo = this->m_amr->getProbLo();
112 const Real time = this->m_timeStepper->getTime();
115 Real maxGradE, minGradE;
117 DataOps::getMaxMinNorm(maxE, minE, m_E, this->m_amr->getMultiCutVofIterator(this->m_realm, this->m_phase));
121 this->m_amr->getMultiCutVofIterator(this->m_realm, this->m_phase));
123 for (
int lvl = 0; lvl <= this->m_amr->getFinestLevel(); lvl++) {
124 const DisjointBoxLayout& dbl = this->m_amr->getGrids(this->m_realm)[lvl];
125 const DataIterator& dit = dbl.dataIterator();
126 const EBISLayout& ebisl = this->m_amr->getEBISLayout(this->m_realm, this->m_phase)[lvl];
127 const Real dx = this->m_amr->getDx()[lvl];
129 const int nbox = dit.size();
131#pragma omp parallel for schedule(runtime)
132 for (
int mybox = 0; mybox < nbox; mybox++) {
133 const DataIndex& din = dit[mybox];
135 const Box& box = dbl[din];
136 const EBISBox& ebisbox = ebisl[din];
138 const EBCellFAB& electricField = (*m_E[lvl])[din];
139 const EBCellFAB& gradElectricField = (*m_gradE[lvl])[din];
141 const FArrayBox& electricFieldReg = electricField.getFArrayBox();
142 const FArrayBox& gradElectricFieldReg = gradElectricField.getFArrayBox();
144 Vector<EBCellFAB*> tagFields;
145 Vector<FArrayBox*> tagFieldsReg;
146 for (
int i = 0; i < this->m_numTagFields; i++) {
147 tagFields.push_back(&((*this->m_tagFields[i][lvl])[din]));
148 tagFieldsReg.push_back(&(tagFields[i]->getFArrayBox()));
151 auto regularKernel = [&](
const IntVect& iv) ->
void {
152 if (ebisbox.isRegular(iv)) {
153 const RealVect pos = probLo + RealVect(iv) * dx;
155 const RealVect E = RealVect(
156 D_DECL(electricFieldReg(iv, 0), electricFieldReg(iv, 1), electricFieldReg(iv, 2)));
157 const RealVect gradE = RealVect(
158 D_DECL(gradElectricFieldReg(iv, 0), gradElectricFieldReg(iv, 1), gradElectricFieldReg(iv, 2)));
161 compTagFields = this->computeTagFields(pos, time, dx, E, minE, maxE, gradE, minGradE, maxGradE);
163 for (
int i = 0; i < this->m_numTagFields; i++) {
164 (*tagFieldsReg[i])(iv, 0) = compTagFields[i];
170 auto irregularKernel = [&](
const VolIndex& vof) ->
void {
171 const RealVect pos = probLo +
Location::position(Location::Cell::Center, vof, ebisbox, dx);
173 const RealVect E = RealVect(D_DECL(electricField(vof, 0), electricField(vof, 1), electricField(vof, 2)));
174 const RealVect gradE = RealVect(
175 D_DECL(gradElectricField(vof, 0), gradElectricField(vof, 1), gradElectricField(vof, 2)));
178 compTagFields = this->computeTagFields(pos, time, dx, E, minE, maxE, gradE, minGradE, maxGradE);
180 for (
int i = 0; i < this->m_numTagFields; i++) {
181 (*tagFields[i])(vof, 0) = compTagFields[i];
187 VoFIterator& vofit = (*this->m_amr->getVofIterator(this->m_realm, this->m_phase)[lvl])[din];
188 BoxLoops::loop<D_DECL(1, 1, 1)>(box, regularKernel);
192 for (
int i = 0; i < this->m_numTagFields; i++) {
193 this->m_amr->conservativeAverage(this->m_tagFields[i], this->m_realm, this->m_phase);
194 this->m_amr->interpGhost(this->m_tagFields[i], this->m_realm, this->m_phase);
198 for (
int i = 0; i < this->m_numTagFields; i++) {
199 this->m_amr->computeGradient(this->m_gradTagFields[i], this->m_tagFields[i], this->m_realm, this->m_phase);
200 this->m_amr->conservativeAverage(this->m_gradTagFields[i], this->m_realm, this->m_phase);
204 this->deallocateStorage();