20 #pragma warning(disable: 4786)
68 typedef std::vector<LoadBCMFC::Pointer> MFCArray;
77 for(LoadArray::iterator l =
load.begin(); l !=
load.end(); l++)
84 mfcLoads.push_back(l1);
100 for(ElementArray::iterator e =
el.begin(); e !=
el.end(); e++)
102 vnl_matrix<Float> Ke;
103 (*e)->GetStiffnessMatrix(Ke);
104 vnl_matrix<Float> Me;
105 (*e)->GetMassMatrix(Me);
106 int Ne=(*e)->GetNumberOfDegreesOfFreedom();
111 for(
int j=0; j<Ne; j++)
114 for(
int k=0; k<Ne; k++)
117 if ( (*e)->GetDegreeOfFreedom(j) >=
NGFN ||
118 (*e)->GetDegreeOfFreedom(k) >=
NGFN )
120 throw FEMExceptionSolution(__FILE__,__LINE__,
"SolverCrankNicolson::AssembleKandM()",
"Illegal GFN!");
128 if ( Ke(j,k) !=
Float(0.0) || Me(j,k) !=
Float(0.0) )
133 (*e)->GetDegreeOfFreedom(k),
138 (*e)->GetDegreeOfFreedom(k),
151 for(LoadArray::iterator l2 =
load.begin(); l2 !=
load.end(); l2++)
163 for (
int j=0; j<Ne; j++)
166 for (
int k=0; k<Ne; k++)
172 throw FEMExceptionSolution(__FILE__,__LINE__,
"SolverCrankNicolson::AssembleKandM()",
"Illegal GFN!");
177 if ( Le(j,k) !=
Float(0.0) )
209 typedef std::map<Element::DegreeOfFreedomIDType,Float> BCTermType;
213 for(LoadArray::iterator l =
load.begin(); l !=
load.end(); l++)
218 bcterm[ l1->m_element->GetDegreeOfFreedom(l1->m_dof) ]=l1->m_value[dim];
223 for( BCTermType::iterator q = bcterm.begin(); q != bcterm.end(); q++)
236 for( BCTermType::iterator q = bcterm.begin(); q != bcterm.end(); q++)
279 Float ulim,u,r,q,fu,dum;
283 dum=ax; ax=bx; bx=dum;
284 dum=fb; fb=fa; fa=dum;
296 u=(bx)-((bx-cx)*q-(bx-ax)*r)/denom;
297 ulim=bx + Glimit*(cx-bx);
298 if ((bx-u)*(u-cx) > 0.0)
319 else if ( (cx-u)*(u-ulim) > 0.0)
324 bx=cx; cx=u; u=cx+Gold*(cx-bx);
329 else if ( (u-ulim)*(ulim-cx) >= 0.0)
345 if ( vcl_fabs(ax) > 1.e3 || vcl_fabs(bx) > 1.e3 || vcl_fabs(cx) > 1.e3)
347 ax=-2.0; bx=1.0; cx=2.0;
358 Float CGOLD = 0.3819660;
361 Float ax=0.0, bx=1.0, cx=2.0;
369 Float a,b,d=0.,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm;
373 a=((ax < cx) ? ax : cx);
374 b=((ax > cx) ? ax : cx);
379 for (iter = 1; iter <=MaxIters; iter++)
382 tol2=2.0*(tol1=tol*vcl_fabs(x)+ZEPS);
383 if (vcl_fabs(x-xm) <= (tol2-0.5*(b-a)))
390 if (vcl_fabs(e) > tol1)
396 if (q>0.0) p = -1.*p;
400 if (vcl_fabs(p) >= vcl_fabs(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x))
401 d=CGOLD*(e=(x>=xm ? a-x : b-x));
404 if (q == 0.0) q=q +ZEPS;
407 if (u-a < tol2 || b-u < tol2) d=
GSSign(tol1,xm-x);
412 d=CGOLD*(e=(x>= xm ? a-x : b-x));
415 u=(vcl_fabs(d) >= tol1 ? x+d : x +
GSSign(tol1,d));
419 if ( u >= x ) a=x;
else b=x;
425 if (u<x) a = u;
else b=u;
426 if (fu <= fw || w ==x)
433 else if (fu <= fv || v==x || v == w)
456 Float f1,f2,x0,x1,x2,x3;
463 if (vcl_fabs(cx-bx) > vcl_fabs(bx-ax))
475 unsigned int iters=0;
476 while (vcl_fabs(x3-x0) > tol*(vcl_fabs(x1)+vcl_fabs(x2)) && iters < MaxIters)
481 x0=x1; x1=x2; x2=R*x1+C*x3;
486 x3=x2; x2=x1; x1=R*x2+C*x0;
507 for (
unsigned int j=0; j<
NGFN; j++)
530 Float DeformationEnergy=0.0;
531 Float iSolVal,jSolVal;
533 for (
unsigned int i=0; i<
NGFN; i++)
545 Float TempRowVal=0.0;
546 for (
unsigned int j=0; j<
NGFN; j++)
558 DeformationEnergy += iSolVal*TempRowVal;
560 return DeformationEnergy;
567 Float ForceEnergy=0.0,FVal=0.0;
568 Float DeformationEnergy=0.0;
569 Float iSolVal,jSolVal;
571 for (
unsigned int i=0; i<
NGFN; i++)
580 ForceEnergy += iSolVal*FVal;
590 Float TempRowVal=0.0;
591 for (
unsigned int j=0; j<
NGFN; j++)
603 DeformationEnergy += iSolVal*TempRowVal;
619 Float maxs=0.0,CurrentTotSolution,CurrentSolution,CurrentForce;
620 Float mins2=0.0, maxs2=0.0;
623 for(
unsigned int i=0;i<
NGFN;i++)
628 if (CurrentSolution < mins2 )
630 mins2=CurrentSolution;
632 else if (CurrentSolution > maxs2 )
634 maxs2=CurrentSolution;
636 if (vcl_fabs(CurrentSolution) > absmax) absmax=vcl_fabs(CurrentSolution);
649 CurrentSolution=optimum*CurrentSolution;
660 if ( vcl_fabs(CurrentTotSolution) > maxs )
662 maxs=vcl_fabs(CurrentTotSolution);
680 Float mins=0.0, maxs=0.0;
681 Float mins2=0.0, maxs2=0.0;
682 for(
unsigned int i=0;i<
NGFN;i++)
685 if (CurrentSolution < mins2 ) mins2=CurrentSolution;
686 else if (CurrentSolution > maxs2 ) maxs2=CurrentSolution;
688 if (CurrentSolution < mins ) mins=CurrentSolution;
689 else if (CurrentSolution > maxs ) maxs=CurrentSolution;
701 for(
unsigned int i=0;i<
NGFN;i++)
705 Float newsol=t*(temp)+(1.-t)*temp2;
709 if ( newsol > maxs ) maxs=newsol;
715 for(
unsigned int i=0;i<
NGFN;i++)
723 std::cout <<
" printing current displacements " << std::endl;
724 for(
unsigned int i=0;i<
NGFN;i++)
732 std::cout <<
" printing current forces " << std::endl;
733 for(
unsigned int i=0;i<
NGFN;i++)