197#ifdef PROTEUS_USE_SIMMETRIX
201 pAManager attmngr = SModel_attManager(model);
202 pACase acase = AMAN_findCaseByType(attmngr,
"problem definition");
204 if(comm_rank==0)std::cout<<
"Found case, setting the model"<<std::endl;
205 AttCase_setModel(acase,model);
207 AttCase_associate(acase,NULL);
210 GFIter gfIter = GM_faceIter(model);
211 pAttribute Att[GM_numFaces(model)];
212 int attMap[GM_numFaces(model)];
215 char strAtt[2][25] = {
"traction vector",
"comp3"};
218 while(gFace = GFIter_next(gfIter))
220 if(GEN_attrib((pGEntity)gFace,strAtt[0]))
222 modelEntTag=GEN_tag((pGEntity)gFace);
223 Att[nF]=GEN_attrib((pGEntity)gFace,strAtt[0]);
224 attMap[nF] = modelEntTag;
228 GFIter_delete(gfIter);
230 apf::MeshIterator* fIter = m->begin(FACE);
231 apf::MeshEntity* fEnt;
235 const int bcFlag[
nsd+1] = {0,1,1,1};
238 char label[9],labelflux[4][9],type_flag;
240 sprintf(label,
"BCtype");
241 BCtag = m->createIntTag(label,4);
242 for(
int idx=0;idx<4;idx++)
244 if(idx == 0) sprintf(&type_flag,
"p");
245 else if(idx == 1) sprintf(&type_flag,
"u");
246 else if(idx == 2) sprintf(&type_flag,
"v");
247 else if(idx == 3) sprintf(&type_flag,
"w");
248 if(idx>0) sprintf(labelflux[idx],
"%c_flux",type_flag);
251 while(fEnt = m->iterate(fIter))
253 apf::ModelEntity* me=m->toModel(fEnt);
254 modelEntTag = m->getModelTag(me);
255 apf::ModelEntity* boundary_face = m->findModelEntity(FACE,modelEntTag);
258 apf::MeshElement* testElem = apf::createMeshElement(m,fEnt);
260 for(
int idx=1;idx<
nsd+1;idx++)
261 fluxtag[idx]= m->createDoubleTag(labelflux[idx],numqpt);
262 apf::destroyMeshElement(testElem);
264 if(me==boundary_face)
266 for(
int i=0;i<nF;i++)
268 if(attMap[i]==modelEntTag)
270 apf::MeshElement* testElem = apf::createMeshElement(m,fEnt);
271 double data[
nsd+1][numqpt];
272 for(
int k=0; k<numqpt;k++)
275 apf::Vector3 evalPtGlobal;
276 apf::mapLocalToGlobal(testElem,evalPt,evalPtGlobal);
277 double evalPtSim[
nsd];
278 evalPtGlobal.toArray(evalPtSim);
279 for(
int j=0;j<
nsd;j++)
280 data[j+1][k]=AttributeTensor1_evalDS((pAttributeTensor1)Att[i], j,evalPtSim);
282 m->setIntTag(fEnt,
BCtag,&(bcFlag[0]));
283 for(
int idx=1;idx<
nsd+1;idx++)
285 m->setDoubleTag(fEnt,
fluxtag[idx],data[idx]);
287 apf::destroyMeshElement(testElem);
292 int dummy[4] = {0,0,0,0};
293 m->setIntTag(fEnt,
BCtag,&(dummy[0]));
298 int dummy[4] = {0,0,0,0};
299 m->setIntTag(fEnt,
BCtag,&(dummy[0]));
304 AMAN_release( attmngr );
307 std::cout<<
"Case not found, no BCs?\n"<<std::endl;
311 if(comm_rank==0)std::cout<<
"Finished reading and storing diffusive flux BCs\n";
337 apf::Field* currentField;
352 currentField = samSz::isoSize(m);
356 apf::Field* errorField = sizeFieldList.front();
360 apf::Field *errorTriggered = apf::createLagrangeField(m,
"errorTriggered", apf::SCALAR, 1);
362 apf::MeshEntity* ent;
363 apf::MeshIterator* it = m->begin(0);
364 while( (ent = m->iterate(it)) )
366 double h_current = apf::getScalar(currentField,ent,0);
367 double h_needed = apf::getScalar(errorField,ent,0);
368 if(h_current>h_needed*1.5){
370 apf::setScalar(errorTriggered,ent,0,h_current/h_needed*1.0);
377 apf::setScalar(errorTriggered,ent,0,-1);
384 while( (ent = m->iterate(it)) )
386 double h_current = apf::getScalar(currentField,ent,0);
387 double h_needed = apf::getScalar(errorField,ent,0);
388 apf::setScalar(errorField,ent,0,h_current/h_needed*1.0);
392 assertFlag = adaptFlag;
393 PCU_Add_Ints(PCUObj, &assertFlag,1);
398 double totalNodes = countTotal(m,0,PCUObj);
399 double triggeredPercentage = assertFlag*100.0/totalNodes;
401 sprintf(buffer,
"Need to error adapt %f%%",triggeredPercentage);
415 apf::destroyField(currentField);
417 apf::destroyField(errorTriggered);
432 apf::Field* errorTriggered;
433 if(m->findField(
"errorTriggered"))
434 errorTriggered = m->findField(
"errorTriggered");
436 errorTriggered = apf::createField(m,
"errorTriggered",apf::SCALAR,apf::getVoronoiShape(m->getDimension(),1));
438 apf::Field* error_current = m->findField(
"VMSH1");
439 apf::Field* error_reference=NULL;
442 if(m->findField(
"errorRate"))
443 apf::destroyField(m->findField(
"errorRate"));
444 apf::Field* errorRateField = apf::createField(m,
"errorRate",apf::SCALAR,apf::getVoronoiShape(m->getDimension(),1));
447 apf::MeshEntity* ent;
448 apf::MeshIterator* it;
452 it = m->begin(m->getDimension());
453 while( (ent = m->iterate(it) ) )
455 apf::setScalar(errorTriggered,ent,0,-1.0);
456 apf::setScalar(errorRateField,ent,0,0.0);
459 logEvent(
"SET ERROR TRIGGERED!",4);
466 if(!m->findField(
"error_reference"))
468 T_reference = T_current;
469 error_reference = apf::createField(m,
"error_reference",apf::SCALAR,apf::getVoronoiShape(
nsd,1));
470 apf::copyData(error_reference,error_current);
471 logEvent(
"SUCCESSFULLY COPIED!",4);
477 error_reference = m->findField(
"error_reference");
482 if(m->findField(
"sizeRatio"))
483 apf::destroyField(m->findField(
"sizeRatio"));
484 apf::Field* sizeRatioField = apf::createField(m,
"sizeRatio",apf::SCALAR,apf::getVoronoiShape(m->getDimension(),1));
486 it = m->begin(m->getDimension());
488 while( (ent = m->iterate(it) ) )
490 double err_local_current = apf::getScalar(error_current,ent,0);
491 double err_local_ref = apf::getScalar(error_reference,ent,0);
492 double errorRate = (err_local_current-err_local_ref)/(T_current-T_reference);
493 apf::setScalar(errorRateField,ent,0,errorRate);
494 double err_predict = errorRate*delta_T_next + err_local_current;
502 apf::MeshElement* element = apf::createMeshElement(m, ent);
504 if (m->getDimension() == 2)
505 h_old = apf::computeLargestHeightInTri(m,ent);
507 h_old = apf::computeShortestHeightInTet(m,ent);
508 h_new = h_old * pow((target_error / err_predict),2.0/(2.0*(1.0)+
nsd));
514 double sizeRatio_local_predict = h_old/h_new;
515 apf::setScalar(sizeRatioField,ent,0,sizeRatio_local_predict);
516 apf::destroyMeshElement(element);
521 if(apf::getScalar(errorTriggered,ent,0)==1)
524 apf::setScalar(errorTriggered,ent,0,2.0);
527 apf::setScalar(errorTriggered,ent,0,1.0);
530 apf::setScalar(errorTriggered,ent,0,-1.0);
537 logEvent(
"Adapting because upper limit was reached.",4);
541 assertFlag = adaptFlag;
542 PCU_Add_Ints(PCUObj, &assertFlag,1);
549 logEvent(
"Need to error based adapt!!!",4);
571 it = m->begin(m->getDimension());
572 while( (ent = m->iterate(it) ) )
574 double err_local_current = apf::getScalar(error_current,ent,0);
576 apf::setScalar(error_reference,ent,0,err_local_current);
581 T_reference = T_current;
628 apf::Field* currentField;
641 currentField = samSz::isoSize(m);
642 double edgeRatio = 1.5;
647 apf::Field* interfaceField = sizeFieldList.front();
652 apf::MeshEntity* ent;
653 apf::MeshIterator* it = m->begin(0);
654 while( (ent = m->iterate(it)) )
656 double h_current = apf::getScalar(currentField,ent,0);
657 double h_needed = apf::getScalar(interfaceField,ent,0);
658 if(h_current/h_needed > edgeRatio){
664 assertFlag = adaptFlag;
665 PCU_Add_Ints(PCUObj, &assertFlag,1);
668 apf::destroyField(currentField);
669 apf::destroyField(interfaceField);
695 double t1 = PCU_Time();
697 double t2 = PCU_Time();
699 std::ofstream myfile;
700 myfile.open(
"error_estimator_timing.txt", std::ios::app );
701 myfile << t2-t1<<std::endl;
705 if((
hasVMS) && std::string(inputString)==
""){
717 if(
nAdapt>1 && std::string(inputString)==
"interface")
719 else if(
nAdapt > 2 && std::string(inputString)==
"")
723 size_iso = m->findField(
"proteus_size");
725 size_frame = m->findField(
"proteus_sizeFrame");
726 size_scale = m->findField(
"proteus_sizeScale");
740 isotropicIntersect();
744 sprintf(namebuffer,
"pumi_preadapt_%i",
nAdapt);
745 apf::writeVtkFiles(namebuffer, m);
753 freeField(errRho_reg);
754 freeField(errRel_reg);
758 if(PCU_Comm_Self(PCUObj)==0) std::cout<<
"cleared VMS field\n";
767 for (
int d = 0; d <= m->getDimension(); ++d)
768 freeNumbering(local[d]);
770 apf::Field* adaptSize;
771 apf::Field* adaptFrame;
776 in = ma::makeAdvanced(ma::configureUniformRefine(m));
777 in->shouldFixShape=
false;
780 assert(size_iso || (size_scale && size_frame));
783 adaptSize = apf::createFieldOn(m,
"adapt_size", apf::VECTOR);
784 adaptFrame = apf::createFieldOn(m,
"adapt_frame", apf::MATRIX);
785 apf::copyData(adaptSize, size_scale);
786 apf::copyData(adaptFrame, size_frame);
787 in = ma::makeAdvanced(ma::configure(m, adaptSize, adaptFrame));
790 adaptSize = apf::createFieldOn(m,
"adapt_size", apf::SCALAR);
791 apf::copyData(adaptSize, size_iso);
792 in = ma::makeAdvanced(ma::configure(m, adaptSize));
796 ma::validateInput(in);
797 in->shouldRunPreZoltan =
true;
798 in->shouldRunMidZoltan =
true;
799 in->shouldRunPostZoltan =
true;
800 in->maximumImbalance = 1.05;
801 in->maximumIterations =
numIter;
804 in->shouldSnap =
true;
805 in->shouldTransferParametric=
true;
808 in->shouldSnap =
false;
812 double t1 = PCU_Time();
814 ma::adaptVerbose(in);
815 double t2 = PCU_Time();
843 sprintf(namebuffer,
"pumi_postadapt_%i",
nAdapt);
844 apf::writeVtkFiles(namebuffer, m);
849 apf::destroyField(adaptSize);
851 apf::destroyField(adaptFrame);
855 m->writeNative(
"DEBUG_restart.smb");
887 apf::Field* voff = m->findField(
"vof");
890 apf::MeshIterator* it = m->begin(m->getDimension());
892 while ((e = m->iterate(it))) {
893 apf::MeshElement* elem = apf::createMeshElement(m,e);
894 apf::Element* voff_elem = apf::createElement(voff, elem);
896 for(
int l = 0; l < apf::countIntPoints(elem,
int_order); ++l) {
899 double vof_val = apf::getScalar(voff_elem,qpt);
900 double rho_val =
getMPvalue(vof_val,rho[0],rho[1]);
901 double weight = apf::getIntWeight(elem,
int_order,l);
903 apf::getJacobian(elem,qpt,J);
904 double Jdet = apf::getJacobianDeterminant(J,m->getDimension());
905 mass += rho_val*weight*Jdet;
907 apf::destroyElement(voff_elem);
908 apf::destroyMeshElement(elem);
911 PCU_Add_Doubles(PCUObj, &mass,1);
930 for(
int i =0;i<m->countFields();i++)
932 apf::Field* sample = m->getField(i);
937 apf::Field* sample = m->findField(
"velocity_old");
940 sample = m->findField(
"vof_old");
942 sample = m->findField(
"ls_old");
944 sample = m->findField(
"phi");
946 sample = m->findField(
"phi_old");
948 sample = m->findField(
"phi_old_old");
950 sample = m->findField(
"phid_old");
952 sample = m->findField(
"phiCorr");
954 sample = m->findField(
"phiCorr_old");
956 sample = m->findField(
"phiCorr_old_old");
958 sample = m->findField(
"p_old");
960 sample = m->findField(
"p");
962 sample = m->findField(
"p_old_old");
965 sample = m->findField(
"VMSH1");
967 sample = m->findField(
"VMSL2");
971 apf::DynamicArray<apf::MeshTag*> listTags;
972 m->getTags(listTags);
973 int nTags = listTags.getSize();
974 int numDim = m->getDimension();
975 for(
int i=0; i < nTags; i++)
977 std::string ignoreString (
"proteus_number");
978 std::string tagName (m->getTagName(listTags[i]));
979 if(tagName.find(ignoreString) != std::string::npos)
984 for(
int j=0;j<(numDim+1);j++)
986 apf::MeshIterator* it = m->begin(j);
987 apf::MeshEntity* ent;
988 while( (ent = m->iterate(it)) )
990 if(m->hasTag(ent,listTags[i]))
991 m->removeTag(ent,listTags[i]);
995 m->destroyTag(listTags[i]);