39 #include "libmesh/nonlinear_solver.h" 40 #include "libmesh/numeric_vector.h" 41 #include "libmesh/sparse_matrix.h" 42 #include "libmesh/dof_map.h" 49 _enable_dof_handler (enable_dof_handler),
50 _evaluate_output_on_negative_phi (false),
53 _intersection (nullptr),
54 _dof_handler (nullptr),
55 _void_solution_monitor (nullptr),
178 #if MAST_ENABLE_PLPLOT == 1 181 #include "plplot/plplot.h" 183 void plot_elem(
const libMesh::Elem& e) {
189 x = RealVectorX::Zero(n+1),
190 y = RealVectorX::Zero(n+1);
192 for (
unsigned int i=0; i<n+1; i++) {
193 x(i) = e.point(i%n)(0);
194 y(i) = e.point(i%n)(1);
197 plline(n+1, x.data(), y.data());
202 void plot_points(
const std::vector<libMesh::Point>& pts) {
208 x = RealVectorX::Zero(n),
209 y = RealVectorX::Zero(n);
211 for (
unsigned int i=0; i<n; i++) {
216 plpoin(n, x.data(), y.data(), -1);
222 MAST::LevelSetNonlinearImplicitAssembly::plot_sub_elems(
bool plot_reference_elem,
223 bool plot_low_phi_elem,
224 bool plot_high_phi_elem) {
233 libMesh::MeshBase::const_element_iterator el =
234 nonlin_sys.get_mesh().active_local_elements_begin();
235 const libMesh::MeshBase::const_element_iterator end_el =
236 nonlin_sys.get_mesh().active_local_elements_end();
241 plenv(0,.3,0,.3,0,0);
244 for ( ; el != end_el; ++el) {
246 const libMesh::Elem* elem = *el;
251 const std::vector<Real>& JxW = fe.
get_JxW();
252 std::cout <<
"==== original JxW: " << std::accumulate(JxW.begin(),
253 JxW.end(), 0.) << std::endl;
257 if (plot_reference_elem) {
265 const std::vector<const libMesh::Elem *> &
270 if (plot_low_phi_elem) {
272 for (
unsigned int i = 0; i < elems_low.size(); i++) {
275 plot_elem(*elems_low[i]);
279 fe->init(*elems_low[i]);
280 const std::vector<Real>& JxW = fe->get_JxW();
281 const std::vector<libMesh::Point>& xyz = fe->get_xyz();
282 std::cout <<
"low: JxW: " << std::accumulate(JxW.begin(),
283 JxW.end(), 0.) << std::endl;
289 if (plot_high_phi_elem) {
291 for (
unsigned int i=0; i<elems_hi.size(); i++) {
294 plot_elem(*elems_hi[i]);
298 fe->init(*elems_hi[i]);
299 const std::vector<Real>& JxW = fe->get_JxW();
300 const std::vector<libMesh::Point>& xyz = fe->get_xyz();
301 std::cout <<
"hi: JxW: " << std::accumulate(JxW.begin(),
302 JxW.end(), 0.) << std::endl;
315 #endif // HAVE_PLPLOT 323 libMesh::NumericVector<Real>* R,
324 libMesh::SparseMatrix<Real>* J,
325 libMesh::NonlinearImplicitSystem& S) {
336 libmesh_assert_equal_to(&S, &(nonlin_sys));
351 nd_indicator = RealVectorX::Ones(1),
352 indicator = RealVectorX::Zero(1);
358 std::vector<libMesh::dof_id_type>
361 const libMesh::DofMap& dof_map =
_system->
system().get_dof_map();
364 std::unique_ptr<libMesh::NumericVector<Real> > localized_solution;
374 libMesh::MeshBase::const_element_iterator el =
375 nonlin_sys.get_mesh().active_local_elements_begin();
376 const libMesh::MeshBase::const_element_iterator end_el =
377 nonlin_sys.get_mesh().active_local_elements_end();
382 for ( ; el != end_el; ++el) {
384 const libMesh::Elem* elem = *el;
387 nonlin_sys.get_mesh().max_elem_id(),
388 nonlin_sys.get_mesh().max_node_id());
389 dof_map.dof_indices (elem, dof_indices);
394 nd_indicator.setZero(elem->n_nodes());
395 for (
unsigned int i=0; i<elem->n_nodes(); i++) {
396 (*_indicator)(elem->node_ref(i), nonlin_sys.time, indicator);
397 nd_indicator(i) = indicator(0);
401 unsigned int ndofs = (
unsigned int)dof_indices.size();
408 nd_indicator.maxCoeff() < tol) && J) {
412 for (
unsigned int i=0; i<ndofs; i++)
414 dof_map.constrain_element_matrix(m, dof_indices);
415 J->add_matrix(m, dof_indices);
419 if (nd_indicator.maxCoeff() > tol &&
425 sub_elem_vec.setZero(ndofs);
426 mat.setZero(ndofs, ndofs);
427 sub_elem_mat.setZero(ndofs, ndofs);
429 for (
unsigned int i=0; i<dof_indices.size(); i++)
430 sol(i) = (*localized_solution)(dof_indices[i]);
467 mat.setIdentity(); mat *= 1.e-6;
470 for (
unsigned int i=0; i<material_rows.size(); i++) {
472 vec(material_rows[i]) = res_factored_u(i);
474 for (
unsigned int j=0; j<material_rows.size(); j++)
475 mat(material_rows[i], material_rows[j]) = jac_factored_uu(i,j);
484 const std::vector<const libMesh::Elem *> &
487 std::vector<const libMesh::Elem*>::const_iterator
488 hi_sub_elem_it = elems_hi.begin(),
489 hi_sub_elem_end = elems_hi.end();
491 for (; hi_sub_elem_it != hi_sub_elem_end; hi_sub_elem_it++ ) {
493 const libMesh::Elem* sub_elem = *hi_sub_elem_it;
522 dof_map.constrain_element_matrix_and_vector(m, v, dof_indices);
524 dof_map.constrain_element_vector(v, dof_indices);
526 dof_map.constrain_element_matrix(m, dof_indices);
529 if (R) R->add_vector(v, dof_indices);
530 if (J) J->add_matrix(m, dof_indices);
554 libMesh::NumericVector<Real>& sensitivity_rhs) {
572 sensitivity_rhs.zero();
585 nd_indicator = RealVectorX::Ones(1),
586 indicator = RealVectorX::Zero(1);
591 std::vector<libMesh::dof_id_type>
594 const libMesh::DofMap& dof_map = nonlin_sys.get_dof_map();
597 std::unique_ptr<libMesh::NumericVector<Real> > localized_solution;
599 *nonlin_sys.solution).release());
605 libMesh::MeshBase::const_element_iterator el =
606 nonlin_sys.get_mesh().active_local_elements_begin();
607 const libMesh::MeshBase::const_element_iterator end_el =
608 nonlin_sys.get_mesh().active_local_elements_end();
613 for ( ; el != end_el; ++el) {
615 const libMesh::Elem* elem = *el;
624 nonlin_sys.get_mesh().max_elem_id(),
625 nonlin_sys.get_mesh().max_node_id());
627 dof_map.dof_indices (elem, dof_indices);
632 nd_indicator.setZero(elem->n_nodes());
633 for (
unsigned int i=0; i<elem->n_nodes(); i++) {
634 (*_indicator)(elem->node_ref(i), nonlin_sys.time, indicator);
635 nd_indicator(i) = indicator(0);
639 if (nd_indicator.maxCoeff() > tol &&
643 unsigned int ndofs = (
unsigned int)dof_indices.size();
645 vec_total.setZero(ndofs);
649 for (
unsigned int i=0; i<dof_indices.size(); i++)
650 sol(i) = (*localized_solution)(dof_indices[i]);
657 const std::vector<const libMesh::Elem *> &
660 std::vector<const libMesh::Elem*>::const_iterator
661 hi_sub_elem_it = elems_hi.begin(),
662 hi_sub_elem_end = elems_hi.end();
664 for (; hi_sub_elem_it != hi_sub_elem_end; hi_sub_elem_it++ ) {
666 const libMesh::Elem* sub_elem = *hi_sub_elem_it;
699 mat.setZero(ndofs, ndofs);
720 for (
unsigned int i=0; i<material_rows.size(); i++)
721 vec1(material_rows[i]) = res_factored_u(i);
737 dof_map.constrain_element_vector(v, dof_indices);
740 sensitivity_rhs.add_vector(v, dof_indices);
751 sensitivity_rhs.close();
778 nd_indicator = RealVectorX::Ones(1),
779 indicator = RealVectorX::Zero(1);
781 std::vector<libMesh::dof_id_type> dof_indices;
782 const libMesh::DofMap& dof_map =
_system->
system().get_dof_map();
785 std::unique_ptr<libMesh::NumericVector<Real> > localized_solution;
795 libMesh::MeshBase::const_element_iterator el =
796 nonlin_sys.get_mesh().active_local_elements_begin();
797 const libMesh::MeshBase::const_element_iterator end_el =
798 nonlin_sys.get_mesh().active_local_elements_end();
801 for ( ; el != end_el; ++el) {
803 const libMesh::Elem* elem = *el;
808 nd_indicator.setZero(elem->n_nodes());
809 for (
unsigned int i=0; i<elem->n_nodes(); i++) {
810 (*_indicator)(elem->node_ref(i), nonlin_sys.time, indicator);
811 nd_indicator(i) = indicator(0);
816 nonlin_sys.get_mesh().max_elem_id(),
817 nonlin_sys.get_mesh().max_node_id());
822 dof_map.dof_indices (elem, dof_indices);
825 unsigned int ndofs = (
unsigned int)dof_indices.size();
828 for (
unsigned int i=0; i<dof_indices.size(); i++)
829 sol(i) = (*localized_solution)(dof_indices[i]);
836 const std::vector<const libMesh::Elem *> &
839 std::vector<const libMesh::Elem*>::const_iterator
840 low_sub_elem_it = elems_low.begin(),
841 low_sub_elem_end = elems_low.end();
843 for (; low_sub_elem_it != low_sub_elem_end; low_sub_elem_it++ ) {
845 const libMesh::Elem* sub_elem = *low_sub_elem_it;
853 output.
init(geom_elem);
860 if (nd_indicator.maxCoeff() > tol &&
863 dof_map.dof_indices (elem, dof_indices);
866 unsigned int ndofs = (
unsigned int)dof_indices.size();
869 for (
unsigned int i=0; i<dof_indices.size(); i++)
870 sol(i) = (*localized_solution)(dof_indices[i]);
877 const std::vector<const libMesh::Elem *> &
881 std::vector<const libMesh::Elem*>::const_iterator
882 hi_sub_elem_it = elems_hi.begin(),
883 hi_sub_elem_end = elems_hi.end();
885 for (; hi_sub_elem_it != hi_sub_elem_end; hi_sub_elem_it++ ) {
887 const libMesh::Elem* sub_elem = *hi_sub_elem_it;
895 output.
init(geom_elem);
918 libMesh::NumericVector<Real>& dq_dX) {
941 nd_indicator = RealVectorX::Ones(1),
942 indicator = RealVectorX::Zero(1);
947 std::vector<libMesh::dof_id_type>
950 const libMesh::DofMap& dof_map =
_system->
system().get_dof_map();
955 std::unique_ptr<libMesh::NumericVector<Real> > localized_solution;
965 libMesh::MeshBase::const_element_iterator el =
966 nonlin_sys.get_mesh().active_local_elements_begin();
967 const libMesh::MeshBase::const_element_iterator end_el =
968 nonlin_sys.get_mesh().active_local_elements_end();
971 for ( ; el != end_el; ++el) {
973 const libMesh::Elem* elem = *el;
976 nonlin_sys.get_mesh().max_elem_id(),
977 nonlin_sys.get_mesh().max_node_id());
982 nd_indicator.setZero(elem->n_nodes());
983 for (
unsigned int i=0; i<elem->n_nodes(); i++) {
984 (*_indicator)(elem->node_ref(i), nonlin_sys.time, indicator);
985 nd_indicator(i) = indicator(0);
993 dof_map.dof_indices (elem, dof_indices);
996 unsigned int ndofs = (
unsigned int)dof_indices.size();
1000 vec_total.setZero(ndofs);
1002 for (
unsigned int i=0; i<dof_indices.size(); i++)
1003 sol(i) = (*localized_solution)(dof_indices[i]);
1010 const std::vector<const libMesh::Elem *> &
1013 std::vector<const libMesh::Elem*>::const_iterator
1014 low_sub_elem_it = elems_low.begin(),
1015 low_sub_elem_end = elems_low.end();
1017 for (; low_sub_elem_it != low_sub_elem_end; low_sub_elem_it++ ) {
1019 const libMesh::Elem* sub_elem = *low_sub_elem_it;
1027 output.
init(geom_sub_elem);
1037 dof_map.constrain_element_vector(v, dof_indices);
1038 dq_dX.add_vector(v, dof_indices);
1039 dof_indices.clear();
1043 if (nd_indicator.maxCoeff() > tol &&
1046 dof_map.dof_indices (elem, dof_indices);
1049 unsigned int ndofs = (
unsigned int)dof_indices.size();
1051 vec1.setZero(ndofs);
1052 vec2.setZero(ndofs);
1053 vec_total.setZero(ndofs);
1055 for (
unsigned int i=0; i<dof_indices.size(); i++)
1056 sol(i) = (*localized_solution)(dof_indices[i]);
1063 const std::vector<const libMesh::Elem *> &
1066 std::vector<const libMesh::Elem*>::const_iterator
1067 hi_sub_elem_it = elems_hi.begin(),
1068 hi_sub_elem_end = elems_hi.end();
1070 for (; hi_sub_elem_it != hi_sub_elem_end; hi_sub_elem_it++ ) {
1072 const libMesh::Elem* sub_elem = *hi_sub_elem_it;
1080 output.
init(geom_sub_elem);
1087 vec2.setZero(ndofs);
1088 mat.setZero(ndofs, ndofs);
1094 ops.
init(geom_elem);
1109 for (
unsigned int i=0; i<material_rows.size(); i++)
1110 vec1(material_rows[i]) = res_factored_u(i);
1118 dof_map.constrain_element_vector(v, dof_indices);
1119 dq_dX.add_vector(v, dof_indices);
1120 dof_indices.clear();
1140 const libMesh::NumericVector<Real>* dXdp,
1169 nd_indicator = RealVectorX::Ones(1),
1170 indicator = RealVectorX::Zero(1);
1172 std::vector<libMesh::dof_id_type> dof_indices;
1173 const libMesh::DofMap& dof_map =
_system->
system().get_dof_map();
1176 std::unique_ptr<libMesh::NumericVector<Real> >
1178 localized_solution_sens;
1191 libMesh::MeshBase::const_element_iterator el =
1192 nonlin_sys.get_mesh().active_local_elements_begin();
1193 const libMesh::MeshBase::const_element_iterator end_el =
1194 nonlin_sys.get_mesh().active_local_elements_end();
1197 for ( ; el != end_el; ++el) {
1199 const libMesh::Elem* elem = *el;
1214 nd_indicator.setZero(elem->n_nodes());
1215 for (
unsigned int i=0; i<elem->n_nodes(); i++) {
1216 (*_indicator)(elem->node_ref(i), nonlin_sys.time, indicator);
1217 nd_indicator(i) = indicator(0);
1222 nonlin_sys.get_mesh().max_elem_id(),
1223 nonlin_sys.get_mesh().max_node_id());
1228 dof_map.dof_indices (elem, dof_indices);
1232 unsigned int ndofs = (
unsigned int)dof_indices.size();
1234 dsol.setZero(ndofs);
1236 for (
unsigned int i=0; i<dof_indices.size(); i++) {
1237 sol(i) = (*localized_solution)(dof_indices[i]);
1239 dsol(i) = (*localized_solution_sens)(dof_indices[i]);
1247 const std::vector<const libMesh::Elem *> &
1250 std::vector<const libMesh::Elem*>::const_iterator
1251 low_sub_elem_it = elems_low.begin(),
1252 low_sub_elem_end = elems_low.end();
1254 for (; low_sub_elem_it != low_sub_elem_end; low_sub_elem_it++ ) {
1256 const libMesh::Elem* sub_elem = *low_sub_elem_it;
1264 output.
init(geom_elem);
1276 if (nd_indicator.maxCoeff() > tol &&
1279 dof_map.dof_indices (elem, dof_indices);
1283 unsigned int ndofs = (
unsigned int)dof_indices.size();
1285 dsol.setZero(ndofs);
1287 for (
unsigned int i=0; i<dof_indices.size(); i++) {
1288 sol(i) = (*localized_solution)(dof_indices[i]);
1290 dsol(i) = (*localized_solution_sens)(dof_indices[i]);
1298 const std::vector<const libMesh::Elem *> &
1302 std::vector<const libMesh::Elem*>::const_iterator
1303 hi_sub_elem_it = elems_hi.begin(),
1304 hi_sub_elem_end = elems_hi.end();
1306 for (; hi_sub_elem_it != hi_sub_elem_end; hi_sub_elem_it++ ) {
1308 const libMesh::Elem* sub_elem = *hi_sub_elem_it;
1316 output.
init(geom_elem);
MAST::AssemblyElemOperations * _elem_ops
provides assembly elem operations for use by this class
virtual void calculate_output(const libMesh::NumericVector< Real > &X, MAST::OutputAssemblyElemOperations &output)
calculates the value of quantity .
MAST::NonlinearSystem & system()
bool _evaluate_output_on_negative_phi
virtual bool if_elem_depends_on_parameter(const libMesh::Elem &e, const MAST::FunctionBase &p) const =0
libMesh::DenseMatrix< Real > DenseRealMatrix
virtual void init(MAST::AssemblyBase &assembly)
MAST::LevelSetIntersection & get_intersection()
This class implements a system for solution of nonlinear systems.
This defines a parameter that is a level set function and stores a pointer to the node in the level-s...
MAST::FieldFunction< RealVectorX > * _indicator
bool override_flag
if true, assume zero solution sensitivity when elem does not dependent on parameter.
void solution_of_factored_element(const libMesh::Elem &elem, RealVectorX &elem_sol)
updates the components of the solution vector in elem_sol for the void domain using the stored soluti...
virtual const std::vector< Real > & get_JxW() const
virtual void calculate_output_derivative(const libMesh::NumericVector< Real > &X, MAST::OutputAssemblyElemOperations &output, libMesh::NumericVector< Real > &dq_dX)
calculates
virtual void set_elem_solution_sensitivity(const RealVectorX &sol)
sets the element solution sensitivity
bool _enable_dof_handler
Evaluates the total sensitivity of output wrt p using the adjoint solution provided in dq_dX for a li...
virtual void set_assembly(MAST::AssemblyBase &assembly)
sets the assembly object
virtual void init(const libMesh::Elem &elem, const MAST::SystemInitialization &sys_init)
This method should not get called for this class.
This provides the base class for definitin of element level contribution of output quantity in an ana...
virtual void calculate_output_direct_sensitivity(const libMesh::NumericVector< Real > &X, const libMesh::NumericVector< Real > *dXdp, const MAST::FunctionBase &p, MAST::OutputAssemblyElemOperations &output)
evaluates the sensitivity of the outputs in the attached discipline with respect to the parametrs in ...
LevelSetNonlinearImplicitAssembly(bool enable_dof_handler)
constructor associates this assembly object with the system
const std::vector< const libMesh::Elem * > & get_sub_elems_negative_phi() const
virtual void zero_for_sensitivity()=0
zeroes the output quantity values stored inside this object so that assembly process can begin...
bool close_matrix
flag to control the closing fo the Jacobian after assembly
virtual void set_indicator_function(MAST::FieldFunction< RealVectorX > &indicator)
attaches indicator function to this.
const MAST::FilterBase * _filter
virtual void set_elem_solution(const RealVectorX &sol)
sets the element solution
virtual void evaluate()=0
this is the abstract interface to be implemented by derived classes.
MAST::LevelSetInterfaceDofHandler * _dof_handler
void init(const MAST::FieldFunction< Real > &phi, const libMesh::Elem &e, const Real t, unsigned int max_elem_id, unsigned int max_node_id)
MAST::SystemInitialization * _system
System for which this assembly is performed.
virtual void elem_sensitivity_calculations(const MAST::FunctionBase &f, RealVectorX &vec)=0
performs the element sensitivity calculations over elem, and returns the element residual sensitivity...
MAST::FieldFunction< RealVectorX > * _velocity
virtual void clear_level_set_function()
clears association with level set function
virtual void residual_and_jacobian(const libMesh::NumericVector< Real > &X, libMesh::NumericVector< Real > *R, libMesh::SparseMatrix< Real > *J, libMesh::NonlinearImplicitSystem &S)
function that assembles the matrices and vectors quantities for nonlinear solution ...
virtual void elem_calculations(bool if_jac, RealVectorX &vec, RealMatrixX &mat)=0
performs the element calculations over elem, and returns the element vector and matrix quantities in ...
MAST::PhysicsDisciplineBase * _discipline
PhysicsDisciplineBase object for which this class is assembling.
MAST::FieldFunction< Real > * _level_set
virtual void set_elem_data(unsigned int dim, const libMesh::Elem &ref_elem, MAST::GeomElem &elem) const =0
some analyses may want to set additional element data before initialization of the GeomElem...
virtual void post_assembly(const libMesh::NumericVector< Real > &X, libMesh::NumericVector< Real > *R, libMesh::SparseMatrix< Real > *J, libMesh::NonlinearImplicitSystem &S)=0
libMesh::DenseVector< Real > DenseRealVector
MAST::NonlinearImplicitAssembly::PostAssemblyOperation * _post_assembly
this object, if non-NULL is user-provided to perform actions after assembly and before returning to t...
Matrix< Real, Dynamic, Dynamic > RealMatrixX
virtual void clear_assembly()
clears the assembly object
void copy(DenseRealMatrix &m1, const RealMatrixX &m2)
This will compute the solution at the interface under the assumption of zero surface normal flux...
Creates a geometric filter for the level-set design variables.
void element_factored_residual_and_jacobian(const libMesh::Elem &elem, const RealMatrixX &jac, const RealVectorX &res, std::vector< libMesh::dof_id_type > &material_dof_ids, RealMatrixX &jac_factored_uu, RealVectorX &res_factored_u)
factorizes the residual and jacobian into the components for the dofs on material nodes...
void clear()
clear the solution
bool if_elem_on_negative_phi() const
This class inherits from MAST::GeomElem and provides an interface to initialize FE objects on sub-ele...
Matrix< Real, Dynamic, 1 > RealVectorX
MAST::LevelSetInterfaceDofHandler & get_dof_handler()
virtual void init(const MAST::GeomElem &elem)=0
initializes the object for calculation of element quantities for the specified elem.
virtual void output_derivative_for_elem(RealVectorX &dq_dX)=0
returns the output quantity derivative with respect to state vector in dq_dX.
Real get_positive_phi_volume_fraction() const
virtual void set_level_set_function(MAST::FieldFunction< Real > &level_set, const MAST::FilterBase &filter)
attaches level set function to this
virtual void elem_topology_sensitivity_calculations(const MAST::FunctionBase &f, const MAST::FieldFunction< RealVectorX > &vel, RealVectorX &vec)=0
performs the element topology sensitivity calculations over elem, and returns the element residual se...
bool if_elem_has_positive_phi_region() const
std::unique_ptr< libMesh::NumericVector< Real > > build_localized_vector(const libMesh::System &sys, const libMesh::NumericVector< Real > &global) const
localizes the parallel vector so that the local copy stores all values necessary for calculation of t...
virtual void clear_level_set_velocity_function()
clears the velocity function
This class acts as a wrapper around libMesh::Elem for the purpose of providing a uniform interface fo...
virtual void init(const MAST::GeomElem &elem, bool init_grads, const std::vector< libMesh::Point > *pts=nullptr)
Initializes the quadrature and finite element for element volume integration.
MAST::LevelSetVoidSolution * _void_solution_monitor
virtual bool sensitivity_assemble(const MAST::FunctionBase &f, libMesh::NumericVector< Real > &sensitivity_rhs)
Assembly function.
virtual void zero_for_analysis()=0
zeroes the output quantity values stored inside this object so that assembly process can begin...
virtual void evaluate_topology_sensitivity(const MAST::FunctionBase &f, const MAST::FieldFunction< RealVectorX > &vel)=0
this evaluates all relevant topological sensitivity components on the element.
const std::vector< const libMesh::Elem * > & get_sub_elems_positive_phi() const
MAST::LevelSetIntersection * _intersection
bool if_use_dof_handler() const
void init(const MAST::SystemInitialization &sys_init, MAST::LevelSetIntersection &intersection, MAST::FieldFunction< Real > &phi)
void init(const libMesh::NumericVector< Real > &sol, const libMesh::NumericVector< Real > *dsol=nullptr)
initializes the data structures to perform the interpolation function of sol.
MAST::AssemblyBase::ElemParameterDependence * _param_dependence
If provided by user, this object is used by sensitiivty analysis to check for whether or the current ...
virtual void clear_elem()
clears the element initialization
bool if_factor_element(const libMesh::Elem &elem) const
virtual void init(const libMesh::Elem &elem, const MAST::SystemInitialization &sys_init)
initialize the object for the specified reference elem.
virtual ~LevelSetNonlinearImplicitAssembly()
destructor resets the association of this assembly object with the system
This class specializes the MAST::FEBase class for level-set applications where integration is to be p...
virtual void set_level_set_velocity_function(MAST::FieldFunction< RealVectorX > &velocity)
the velocity function used to calculate topology sensitivity
void set_evaluate_output_on_negative_phi(bool f)
sets the flag on whether or not to evaluate the output on negative level set function ...
virtual bool is_topology_parameter() const
virtual void evaluate_sensitivity(const MAST::FunctionBase &f)=0
this evaluates all relevant sensitivity components on the element.
void clear()
clears the data structures
MAST::MeshFieldFunction * _sol_function
system solution that will be initialized before each solution