00001 #include "PDEOptIterCallbackBase.hpp" 00002 #include "PDEOptPDEConstrainedObjBase.hpp" 00003 #include "Sundance.hpp" 00004 00005 namespace Sundance 00006 { 00007 00008 DefaultIterCallback::DefaultIterCallback( 00009 const std::string& filename, 00010 const std::string& type, 00011 int frequency) 00012 : type_(type), filename_(filename), frequency_(frequency) 00013 {} 00014 00015 void DefaultIterCallback::call(const PDEConstrainedObjBase* obj, 00016 int iter) const 00017 { 00018 if (iter % frequency_ != 0) return; 00019 00020 string name = filename_ + "-iter-" + Teuchos::toString(iter); 00021 00022 FieldWriter writer; 00023 00024 if (type_=="VTK") 00025 { 00026 writer = new VTKWriter(name); 00027 } 00028 else if (type_=="Exodus") 00029 { 00030 writer = new ExodusWriter(name); 00031 } 00032 else if (type_=="Matlab") 00033 { 00034 writer = new MatlabWriter(name); 00035 } 00036 else 00037 { 00038 TEUCHOS_TEST_FOR_EXCEPTION(true, RuntimeError, 00039 "writer type [" << type_ << "] not defined"); 00040 } 00041 00042 Array<Expr> state = obj->stateVars(); 00043 Array<Expr> adjoint = obj->adjointVars(); 00044 Expr design = obj->designVar(); 00045 00046 writer.addMesh(obj->mesh()); 00047 00048 for (int b=0; b<state.size(); b++) 00049 { 00050 for (int i=0; i<state[b].size(); i++) 00051 { 00052 string tag = "[" + Teuchos::toString(b) 00053 + "][" + Teuchos::toString(i) + "]"; 00054 writer.addField("state" + tag, new ExprFieldWrapper(state[b][i])); 00055 writer.addField("adjoint" + tag, new ExprFieldWrapper(adjoint[b][i])); 00056 } 00057 } 00058 00059 for (int i=0; i<design.size(); i++) 00060 { 00061 string tag = "[" + Teuchos::toString(i) + "]"; 00062 writer.addField("design" + tag, new ExprFieldWrapper(design[i])); 00063 } 00064 00065 writer.write(); 00066 } 00067 00068 00069 }