20 #pragma warning(disable: 4786)
107 if (!o) {
continue; }
139 #ifndef FEM_USE_SMART_POINTERS
145 throw FEMExceptionIO(__FILE__,__LINE__,
"Solver::Read()",
"Error reading FEM problem stream!");
157 for(NodeArray::iterator i =
node.begin(); i !=
node.end(); i++)
161 f<<
"\n<END> % End of nodes\n\n";
163 for(MaterialArray::iterator i=
mat.begin(); i !=
mat.end(); i++)
167 f<<
"\n<END> % End of materials\n\n";
169 for(ElementArray::iterator i=
el.begin(); i !=
el.end(); i++)
173 f<<
"\n<END> % End of elements\n\n";
175 for(LoadArray::iterator i=
load.begin(); i !=
load.end(); i++)
179 f<<
"\n<END> % End of loads\n\n";
190 for(NodeArray::iterator n=
node.begin(); n !=
node.end(); n++)
192 (*n)->m_elements.clear();
193 (*n)->ClearDegreesOfFreedom();
196 for(ElementArray::iterator e=
el.begin(); e !=
el.end(); e++)
201 unsigned int Npts=(*e)->GetNumberOfNodes();
202 for(
unsigned int pt=0; pt<Npts; pt++)
204 (*e)->GetNode(pt)->m_elements.insert(*e);
217 for(ElementArray::iterator e=
el.begin(); e !=
el.end(); e++)
220 for(
unsigned int n=0; n<(*e)->GetNumberOfNodes(); n++)
222 for(
unsigned int dof=0; dof<(*e)->GetNumberOfDegreesOfFreedomPerNode(); dof++)
226 (*e)->GetNode(n)->SetDegreeOfFreedom(dof,
NGFN);
255 for(LoadArray::iterator l=
load.begin(); l !=
load.end(); l++)
278 for(ElementArray::iterator e=
el.begin(); e !=
el.end(); e++)
289 for(LoadArray::iterator l2=
load.begin(); l2 !=
load.end(); l2++)
293 l3->AssignToElement(&
el);
321 for(
int j=0; j<Ne; j++)
324 for(
int k=0; k<Ne; k++)
330 throw FEMExceptionSolution(__FILE__,__LINE__,
"Solver::AssembleLandmarkContribution()",
"Illegal GFN!");
339 if ( Le[j][k] !=
Float(0.0) )
357 for(
int j=0; j<Ne; j++)
360 for(
int k=0; k<Ne; k++)
375 if ( Ke[j][k] !=
Float(0.0) )
397 typedef std::map<Element::DegreeOfFreedomIDType,Float> BCTermType;
410 for(LoadArray::iterator l=
load.begin(); l !=
load.end(); l++)
422 l0->SetSolution(
m_ls);
432 if ( (l1->F.size() % l1->m_element->GetNumberOfDegreesOfFreedomPerNode()) != 0 )
434 throw FEMExceptionSolution(__FILE__,__LINE__,
"Solver::AssembleF()",
"Illegal size of a force vector in LoadNode object!");
438 for(
unsigned int d=0; d < (l1->m_element->GetNumberOfDegreesOfFreedomPerNode()); d++)
455 m_ls->
AddVectorValue(dof , l1->F[d+l1->m_element->GetNumberOfDegreesOfFreedomPerNode()*dim]);
469 if ( !(l1->el.empty()) )
475 for(LoadElement::ElementPointersVectorType::const_iterator i=l1->el.begin(); i != l1->el.end(); i++)
483 for(
unsigned int j=0; j<Ne; j++)
504 for(ElementArray::iterator e=
el.begin(); e !=
el.end(); e++)
507 unsigned int Ne=(*e)->GetNumberOfDegreesOfFreedom();
509 for(
unsigned int j=0; j<Ne; j++)
511 if ( (*e)->GetDegreeOfFreedom(j) >=
NGFN )
546 bcterm[ l1->m_element->GetDegreeOfFreedom(l1->m_dof) ]=l1->m_value[dim];
567 const unsigned int totGFN=
NGFN+
NMFC;
568 for(
unsigned int i=0; i<totGFN; i++ )
576 for( BCTermType::iterator q=bcterm.begin(); q != bcterm.end(); q++)
600 throw FEMExceptionSolution(__FILE__,__LINE__,
"Solver::Solve()",
"Master stiffness matrix was not initialized!");
604 throw FEMExceptionSolution(__FILE__,__LINE__,
"Solver::Solve()",
"Master force vector was not initialized!");
625 for(ElementArray::iterator e=
el.begin(); e !=
el.end(); e++)
627 unsigned int Ne=(*e)->GetNumberOfDegreesOfFreedom();
628 LocalSolution.set_size(Ne,1);
630 for(
unsigned int j=0; j<Ne; j++)
635 U += (*e)->GetElementDeformationEnergy(LocalSolution);
650 for(LoadArray::iterator l=
load.begin(); l !=
load.end(); l++)
670 for(LoadBCMFC::LhsType::iterator q=c->lhs.begin();
676 q->m_element->GetDegreeOfFreedom(q->dof);
701 Float fixedvalue=c->m_value[dim];
715 if( fixedvalue != 0.0 )
724 for(LinearSystemWrapper::ColumnArray::iterator cc=cols.begin(); cc != cols.end(); cc++)
739 for(LinearSystemWrapper::ColumnArray::iterator cc=cols.begin(); cc != cols.end(); cc++)
767 for(
unsigned int i=0;i<size.size();i++)
772 for(
unsigned int i=0;i<size.size();i++)
774 image_origin[i]=bb1[i];
777 for(
unsigned int i=0;i<size.size();i++)
779 image_spacing[i]=(bb2[i]-bb1[i])/(image_size[i]-1);
796 for(ElementArray::iterator e=
el.begin(); e !=
el.end(); e++)
799 v1=(*e)->GetNodeCoordinates(0);
802 const unsigned int NumberOfDimensions=(*e)->GetNumberOfSpatialDimensions();
804 for(
unsigned int n=1; n < (*e)->GetNumberOfNodes(); n++ )
806 const VectorType& v=(*e)->GetNodeCoordinates(n);
807 for(
unsigned int d=0; d < NumberOfDimensions; d++ )
826 if ( i < NumberOfDimensions )
846 region_size[i] = vi2[i]-vi1[i]+1;
866 for(
unsigned int d=0; d<NumberOfDimensions; d++)
868 global_point[d]=pt[d];
873 if( (*e)->GetLocalFromGlobalCoordinates(global_point,local_point) )