v0.16.0
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | Private Attributes | List of all members
SphericalArcLengthControl Struct Reference

Implementation of spherical arc-length method. More...

#include "tutorials/cor-12_cohesive_interface/src/ArcLengthTools.hpp"

Inheritance diagram for SphericalArcLengthControl:
[legend]
Collaboration diagram for SphericalArcLengthControl:
[legend]

Public Member Functions

DEPRECATED SphericalArcLengthControl (ArcLengthCtx *arc_ptr_raw)
 
 SphericalArcLengthControl (boost::shared_ptr< ArcLengthCtx > &arc_ptr)
 
virtual ~SphericalArcLengthControl ()
 
MoFEMErrorCode preProcess ()
 
MoFEMErrorCode operator() ()
 
MoFEMErrorCode postProcess ()
 
virtual double calculateLambdaInt ()
 Calculate f_lambda(dx,lambda)
 
virtual MoFEMErrorCode calculateDb ()
 Calculate db.
 
virtual MoFEMErrorCode calculateDxAndDlambda (Vec x)
 
virtual MoFEMErrorCode calculateInitDlambda (double *dlambda)
 
virtual MoFEMErrorCode setDlambdaToX (Vec x, double dlambda)
 
DEPRECATED SphericalArcLengthControl (ArcLengthCtx *arc_ptr_raw)
 
 SphericalArcLengthControl (boost::shared_ptr< ArcLengthCtx > &arc_ptr)
 
virtual ~SphericalArcLengthControl ()
 
MoFEMErrorCode preProcess ()
 
MoFEMErrorCode operator() ()
 
MoFEMErrorCode postProcess ()
 
virtual double calculateLambdaInt ()
 Calculate f_lambda(dx,lambda)
 
virtual MoFEMErrorCode calculateDb ()
 Calculate db.
 
virtual MoFEMErrorCode calculateDxAndDlambda (Vec x)
 
virtual MoFEMErrorCode calculateInitDlambda (double *dlambda)
 
virtual MoFEMErrorCode setDlambdaToX (Vec x, double dlambda)
 

Public Attributes

ArcLengthCtxarcPtrRaw
 

Private Attributes

boost::shared_ptr< ArcLengthCtxarcPtr
 

Detailed Description

Implementation of spherical arc-length method.

\[ \alpha \| \Delta\mathbf{x} \|^2 + \Delta\lambda^2 \beta^2 \| \mathbf{F}_\lambda \|^2 = s^2 \]

This is particular implementation of ArcLength control, i.e. spherical arc length control. If beta is set to 0 and alpha is non-zero it is cylindrical arc-length control. Works well with general problem with non-linear geometry. It not guarantee dissipative loading path in case of physical nonlinearities.

\[ \alpha \| \Delta\mathbf{x} \|^2 + \Delta\lambda^2 \beta^2 \| \mathbf{F}_\lambda \|^2 = s^2 \]

This is particular implementation of ArcLength control, i.e. spherical arc length control. If beta is set to 0 and alpha is non-zero it is cylindrical arc-length control. Works well with general problem with non-linear geometry. It not guarantee dissipative loading path in case of physical nonlinearities.

Definition at line 372 of file ArcLengthTools.hpp.

Constructor & Destructor Documentation

◆ SphericalArcLengthControl() [1/4]

SphericalArcLengthControl::SphericalArcLengthControl ( ArcLengthCtx arc_ptr_raw)
Deprecated:
use constructor with shared_ptr

Definition at line 656 of file ArcLengthTools.cpp.

657 : FEMethod(), arcPtrRaw(arc_ptr_raw) {}
Structure for user loop methods on finite elements.

◆ SphericalArcLengthControl() [2/4]

SphericalArcLengthControl::SphericalArcLengthControl ( boost::shared_ptr< ArcLengthCtx > &  arc_ptr)

Definition at line 659 of file ArcLengthTools.cpp.

661 : FEMethod(), arcPtrRaw(arc_ptr.get()), arcPtr(arc_ptr) {}
boost::shared_ptr< ArcLengthCtx > arcPtr

◆ ~SphericalArcLengthControl() [1/2]

SphericalArcLengthControl::~SphericalArcLengthControl ( )
virtual

Definition at line 663 of file ArcLengthTools.cpp.

663{}

◆ SphericalArcLengthControl() [3/4]

DEPRECATED SphericalArcLengthControl::SphericalArcLengthControl ( ArcLengthCtx arc_ptr_raw)
Deprecated:
use constructor with shared_ptr

◆ SphericalArcLengthControl() [4/4]

SphericalArcLengthControl::SphericalArcLengthControl ( boost::shared_ptr< ArcLengthCtx > &  arc_ptr)

◆ ~SphericalArcLengthControl() [2/2]

virtual SphericalArcLengthControl::~SphericalArcLengthControl ( )
virtual

Member Function Documentation

◆ calculateDb() [1/2]

MoFEMErrorCode SphericalArcLengthControl::calculateDb ( )
virtual

Calculate db.

\[ \textrm{d}\mathbf{b} = 2 \alpha \Delta\mathbf{x} \]

Definition at line 686 of file ArcLengthTools.cpp.

686 {
688 CHKERR VecCopy(arcPtrRaw->dx, arcPtrRaw->db);
689 CHKERR VecScale(arcPtrRaw->db, 2 * arcPtrRaw->alpha);
691}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
double alpha
displacement scaling factor
SmartPetscObj< Vec > dx
dx = x-x0
SmartPetscObj< Vec > db
db derivative of f(dx*dx), i.e. db = d[ f(dx*dx) ]/dx

◆ calculateDb() [2/2]

virtual MoFEMErrorCode SphericalArcLengthControl::calculateDb ( )
virtual

Calculate db.

\[ \textrm{d}\mathbf{b} = 2 \alpha \Delta\mathbf{x} \]

◆ calculateDxAndDlambda() [1/2]

MoFEMErrorCode SphericalArcLengthControl::calculateDxAndDlambda ( Vec  x)
virtual

Definition at line 738 of file ArcLengthTools.cpp.

738 {
740 // dx
741 CHKERR VecCopy(x, arcPtrRaw->dx);
742 CHKERR VecAXPY(arcPtrRaw->dx, -1, arcPtrRaw->x0);
743 CHKERR VecGhostUpdateBegin(arcPtrRaw->dx, INSERT_VALUES, SCATTER_FORWARD);
744 CHKERR VecGhostUpdateEnd(arcPtrRaw->dx, INSERT_VALUES, SCATTER_FORWARD);
745 // dlambda
746 if (arcPtrRaw->getPetscLocalDofIdx() != -1) {
747 double *array;
748 CHKERR VecGetArray(arcPtrRaw->dx, &array);
750 array[arcPtrRaw->getPetscLocalDofIdx()] = 0;
751 CHKERR VecRestoreArray(arcPtrRaw->dx, &array);
752 }
753 CHKERR VecGhostUpdateBegin(arcPtrRaw->ghosTdLambda, INSERT_VALUES,
754 SCATTER_FORWARD);
755 CHKERR VecGhostUpdateEnd(arcPtrRaw->ghosTdLambda, INSERT_VALUES,
756 SCATTER_FORWARD);
757 // dx2
759 MOFEM_LOG_C("ARC_LENGTH", Sev::verbose,
760 "\tdlambda = %6.4e dx2 = %6.4e", arcPtrRaw->dLambda,
761 arcPtrRaw->dx2);
763}
#define MOFEM_LOG_C(channel, severity, format,...)
DofIdx getPetscLocalDofIdx()
Get local index of load factor.
double dx2
inner_prod(dX,dX)
SmartPetscObj< Vec > ghosTdLambda
double dLambda
increment of load factor
SmartPetscObj< Vec > x0
displacement vector at beginning of step
#define ArcFunctionBegin

◆ calculateDxAndDlambda() [2/2]

virtual MoFEMErrorCode SphericalArcLengthControl::calculateDxAndDlambda ( Vec  x)
virtual

◆ calculateInitDlambda() [1/2]

MoFEMErrorCode SphericalArcLengthControl::calculateInitDlambda ( double dlambda)
virtual

Definition at line 766 of file ArcLengthTools.cpp.

766 {
768 *dlambda = std::sqrt(pow(arcPtrRaw->s, 2) /
769 (pow(arcPtrRaw->beta, 2) * arcPtrRaw->F_lambda2));
770 if (!(*dlambda == *dlambda)) {
771 MOFEM_LOG("ARC_LENGTH", Sev::error)
772 << "s " << arcPtrRaw->s << " " << arcPtrRaw->beta << " "
774 SETERRQ(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
775 "Increment of lambda is not a number");
776 }
778}
@ MOFEM_IMPOSSIBLE_CASE
Definition definitions.h:35
#define MOFEM_LOG(channel, severity)
Log.
double s
arc length radius
double F_lambda2
inner_prod(F_lambda,F_lambda);
double beta
force scaling factor

◆ calculateInitDlambda() [2/2]

virtual MoFEMErrorCode SphericalArcLengthControl::calculateInitDlambda ( double dlambda)
virtual

◆ calculateLambdaInt() [1/2]

double SphericalArcLengthControl::calculateLambdaInt ( )
virtual

Calculate f_lambda(dx,lambda)

\[ f_\lambda(\Delta\mathbf{x},\lambda) = \alpha \| \Delta\mathbf{x} \|^2 + \Delta\lambda^2 \beta^2 \| \mathbf{F}_\lambda \|^2 \]

Definition at line 680 of file ArcLengthTools.cpp.

680 {
681 return arcPtrRaw->alpha * arcPtrRaw->dx2 + pow(arcPtrRaw->dLambda, 2) *
682 pow(arcPtrRaw->beta, 2) *
684}

◆ calculateLambdaInt() [2/2]

virtual double SphericalArcLengthControl::calculateLambdaInt ( )
virtual

Calculate f_lambda(dx,lambda)

\[ f_\lambda(\Delta\mathbf{x},\lambda) = \alpha \| \Delta\mathbf{x} \|^2 + \Delta\lambda^2 \beta^2 \| \mathbf{F}_\lambda \|^2 \]

◆ operator()() [1/2]

MoFEMErrorCode SphericalArcLengthControl::operator() ( )

Definition at line 693 of file ArcLengthTools.cpp.

693 {
695 switch (snes_ctx) {
696 case CTX_SNESSETFUNCTION: {
698 CHKERR VecSetValue(snes_f, arcPtrRaw->getPetscGlobalDofIdx(),
699 arcPtrRaw->res_lambda, ADD_VALUES);
700 MOFEM_LOG_C("ARC_LENGTH", Sev::verbose, "\tres_lambda = %6.4e",
702 } break;
703 case CTX_SNESSETJACOBIAN: {
704 arcPtrRaw->dIag =
706 CHKERR MatSetValue(snes_B, arcPtrRaw->getPetscGlobalDofIdx(),
707 arcPtrRaw->getPetscGlobalDofIdx(), 1, ADD_VALUES);
708 } break;
709 default:
710 break;
711 }
713}
double res_lambda
f_lambda - s
double dIag
diagonal value
DofIdx getPetscGlobalDofIdx()
Get global index of load factor.
virtual double calculateLambdaInt()
Calculate f_lambda(dx,lambda)

◆ operator()() [2/2]

MoFEMErrorCode SphericalArcLengthControl::operator() ( )

◆ postProcess() [1/2]

MoFEMErrorCode SphericalArcLengthControl::postProcess ( )

Definition at line 715 of file ArcLengthTools.cpp.

715 {
717 switch (snes_ctx) {
718 case CTX_SNESSETFUNCTION: {
719 MOFEM_LOG_C("ARC_LENGTH", Sev::verbose, "\tlambda = %6.4e",
721 } break;
722 case CTX_SNESSETJACOBIAN: {
723 CHKERR VecGhostUpdateBegin(arcPtrRaw->ghostDiag, INSERT_VALUES,
724 SCATTER_FORWARD);
725 CHKERR VecGhostUpdateEnd(arcPtrRaw->ghostDiag, INSERT_VALUES,
726 SCATTER_FORWARD);
727 CHKERR MatAssemblyBegin(snes_B, MAT_FLUSH_ASSEMBLY);
728 CHKERR MatAssemblyEnd(snes_B, MAT_FLUSH_ASSEMBLY);
729 MOFEM_LOG_C("ARC_LENGTH", Sev::verbose, "\tdiag = %6.4e",
730 arcPtrRaw->dIag);
731 } break;
732 default:
733 break;
734 }
736}
FieldData & getFieldData()
Get value of load factor.
SmartPetscObj< Vec > ghostDiag

◆ postProcess() [2/2]

MoFEMErrorCode SphericalArcLengthControl::postProcess ( )

◆ preProcess() [1/2]

MoFEMErrorCode SphericalArcLengthControl::preProcess ( )

Definition at line 665 of file ArcLengthTools.cpp.

665 {
667 switch (snes_ctx) {
668 case CTX_SNESSETFUNCTION: {
671 } break;
672 case CTX_SNESSETJACOBIAN: {
673 } break;
674 default:
675 break;
676 }
678}
virtual MoFEMErrorCode calculateDxAndDlambda(Vec x)
virtual MoFEMErrorCode calculateDb()
Calculate db.

◆ preProcess() [2/2]

MoFEMErrorCode SphericalArcLengthControl::preProcess ( )

◆ setDlambdaToX() [1/2]

MoFEMErrorCode SphericalArcLengthControl::setDlambdaToX ( Vec  x,
double  dlambda 
)
virtual

Definition at line 780 of file ArcLengthTools.cpp.

780 {
782 // check if local dof idx is non zero, i.e. that lambda is accessible from
783 // this processor
784 if (arcPtrRaw->getPetscLocalDofIdx() != -1) {
785 double *array;
786 CHKERR VecGetArray(x, &array);
787 double lambda_old = array[arcPtrRaw->getPetscLocalDofIdx()];
788 if (!(dlambda == dlambda)) {
789 MOFEM_LOG("ARC_LENGTH", Sev::error)
790 << "s " << arcPtrRaw->s << " " << arcPtrRaw->beta << " "
792 SETERRQ(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
793 "Increment of lambda is not a number");
794 }
795 array[arcPtrRaw->getPetscLocalDofIdx()] = lambda_old + dlambda;
796 MOFEM_LOG_C("ARC_LENGTH", Sev::verbose,
797 "\tlambda = %6.4e, %6.4e (%6.4e)", lambda_old,
798 array[arcPtrRaw->getPetscLocalDofIdx()], dlambda);
799 CHKERR VecRestoreArray(x, &array);
800 }
802}

◆ setDlambdaToX() [2/2]

virtual MoFEMErrorCode SphericalArcLengthControl::setDlambdaToX ( Vec  x,
double  dlambda 
)
virtual

Member Data Documentation

◆ arcPtr

boost::shared_ptr< ArcLengthCtx > SphericalArcLengthControl::arcPtr
private

Definition at line 410 of file ArcLengthTools.hpp.

◆ arcPtrRaw

ArcLengthCtx * SphericalArcLengthControl::arcPtrRaw

Definition at line 374 of file ArcLengthTools.hpp.


The documentation for this struct was generated from the following files: